Dog foot print

[SWIFT] CLOSURE 본문

IOS/Swift

[SWIFT] CLOSURE

개 발자국 2021. 7. 9. 10:54

클로져란 ?

보통 다른 프로그래밍 언어를 배울 때 Closure를 의미하는 것은 함수가 스코프가 유지 되었을 경우, 함수 내부에 있는 변수는 메모리에서 해제 되지 않는 것 을 의미하는데, 이는 소프트웨어 아키텍쳐 적인 의미의 클로져이다.

swift에서의 클로져는 익명 함수 를 의미 합니다. 익명함수는 재사용 할 가능성이 적어 특정 코드 부분에서만 사용 되는 코드 집합으로, 콜백 패턴과 더불어 사용해서 함수 내부에 필요한 시기에 코드를 실행 할 수 있다는 장점이 존재합니다.

스위프트에는 다음과 같은 3개의 클로저 객체가 존재합니다.

  • 전역 함수
    • 이름이 있으며 주변 환경에서 캡처할 어떤 값도 없는 클로저
  • 중첩 함수
    • 이름이 있으며 자신을 둘러싼 함수로부터 값을 캡처할 수 있는 클로저
  • 클로저 표현식
    • 이름이 없으며 주변 환경으로부터 값을 캡처할 수 있는 경량 문법으로 작성된 클로져이다.

클로저 표현식

/*
*{ (매개 변수) -> 반환 타입 in 
*    실행할 구문 
*}
*/
import UIKit

func sum(x : Int, y : Int) -> Int{
    return x + y;
}

let a = 10;
let b = 20;

let c = sum(x: a, y: b)

let d = { (x : Int , y : Int) -> Int in
    return x + y;
}

let e : Int = d(a, b);

클로저 표현식은 함수와 달리 생략되는 부분이 많다. 그렇지만 클로저 또한 함수 이기 때문에, 그리 무서워 할 필요가 없다.

TIP :

보통 클로저는 재사용 보다는 함수의 콜백으로 사용될 1회성 함수 이기 때문에 위와 같이 변수에 붙여 사용하는 행위는 적다.

콜백으로 사용되는 클로저 표현식

// 함수를 정의하고 사용하기

var numbers = [10,20,4,3,2,6,9,11];

let dsc = { (x : Int , y : Int ) -> Bool in
    return x > y
}

numbers.sort(by: dsc)

//함수를 직접 전달인자에 작성하여 전달하기

numbers.sort(by: {(x : Int, y : Int ) -> Bool in
             return x < y;
})

콜백으로 사용되는 클로저는 아까 위와 같이 변수에 클로저를 할당한다음 이를 전달인자로 넘겨 줄 수 있고, 콜백 파라메터에 직접 클로저를 작성하여 사용이 가능하다.

클로저 단축 문법

import UIKit

// 함수를 정의하고 사용하기

var numbers = [10,20,4,3,2,6,9,11];

//한줄로 작성하기
numbers.sort(by: {(x : Int , y : Int) -> Bool in return x > y})

//반환값을 작성하지 않고, 컴파일러가 추측 하게 하기
numbers.sort(by: {(x : Int , y : Int ) in return x < y});

//() -> 생략하기
numbers.sort(by: {x , y in return x > y});

//return 생략하기 한줄인 경우에
numbers.sort(by: {x , y in x > y});

//타입을 명시 했을 경우에 클로져의 매개변수와 반환 값의 타입을 명시해주지 않아도 된다.
let myScore : (Int) -> String =
    { (a) in "\(a)점" }

//매개변수를 추측하여, 반환값만 명시하기
//$0은 매개변수로 전달된 0번째 파라메터를 의미한다.
numbers.sort(by: {return $0 > $1})

//sort 함수만이 사용가능한 극강의 단축 표현식
numbers.sort(by: >)

트레일링 클로저

import UIKit

var numbers = [10,20,4,3,2,6,9,11];

numbers.sort(){
    (x : Int , y : Int ) -> Bool in
    return x > y
}
print(numbers)

numbers.sort{
    (x : Int , y : Int ) -> Bool in
    return x > y
}

트레일링 클로저는 마지막 파라메터의 타입이 클로져를 지원 하는 경우에만 사용이 가능합니다. 만약 인자값이 클로저를 제외하고는 파라메터가 존재하지 않을 때는 함수 호출자 또한 제거하고 테일링 클로저를 사용 할 수 있습니다.

Auto closure

import UIKit

func condition(condition : @autoclosure () -> Bool, success : @autoclosure () -> Void, failed : @autoclosure () -> Void){

    if condition() == true {
        success()
    }else{
        failed()
    }
}

condition(condition : (10 < 5), success: print("good"), failed: print("fail"));

autoclosure는 일반 구문을 클로저로 자동 변경해주어서 문법을 조금 더 단축 할 수 있는 장점을 가질 수 있습니다.

반응형

'IOS > Swift' 카테고리의 다른 글

[SWIFT] 프로퍼티  (0) 2021.07.13
[SWIFT] 구조체와 클래스  (0) 2021.07.13
[Swift] Inout  (0) 2021.07.08
[SWIFT] 함수 시작하기  (0) 2021.07.07
[SWIFT] Optional  (0) 2021.07.05
Comments