[TIL] Swift - 함수4

신승현·2024년 1월 25일

TIL

목록 보기
9/72

1. 클로저

  • Swift에서 클로저는 일회용 함수를 작성할 수 있는 구문이다.

2. 클로저 표현식

  • 클로저 표현식은 함수와 달리 생략되는 부분이 많다.
  • 하지만 형태에 따라 간결성과 가독성이 달라지므로 주의해야 한다.
// 1. 상수나 변수에 할당 후 실행하는 방법
let f = { () -> Void in
    print("클로저가 실행됩니다")
}

f() // "클로저가 실행됩니다"

// 2. 함수명을 생략하고 실행하는 방법
({ () -> Void in
    print("클로저가 실행됩니다")
})()

// 3. 매개변수가 있는 클로저 표현식
let c = { (s1: Int, s2: String) -> Void in 
    print("s1:\(s1), s2:\(s2)")
}

c(1, "closure") // s1:1, s2:closure

3. 경량문법

  • 클로저 표현식은 주로 인자값으로 사용되는 객체인 만큼, 간결성을 극대화하기 위해 생략할 수 있는 구문들로 이루어져 있다. 필요에 따라 여러 부분을 생략이 가능하다.
var value = [1,9,5,7,3,2];

// 1. 기본적인 함수
func order(s1: Int, s2: Int) -> Bool {
    if s1 > s2 {
        return true;
    } else {
        return false;
    }
}

value.sort(by: order); // [9,7,5,3,2,1]

// 2. 클로저 표현식
value.sort(by: {
    (s1: Int, s2: Int) -> Bool in
    if s1 > s2 {
        return true;
    } else {
        return false;
    }
});
// [9,7,5,3,2,1]

// 3. 더 간결한 표현식
value.sort(by: { (s1: Int, s2: Int) -> Bool in return s1 > s2 });

// 4. 연산자 함수 표현식
value.sort(by: >);

4. 트레일링 클로저

  • 함수의 마지막 인자값이 클로저일 때, 이를 인자값 형식으로 작성하는 대신 함수의 뒤에 꼬리처럼 붙일 수 있는 문법을 의미한다.
  • 주의해야하는 점은 이 문법이 함수의 마지막 인자값에만 적용된다.

5. @escaping과 @autoescape

  • @escaping 속성은 인자값으로 전달된 클로저를 전달해 두었다가 나중에 다른 곳에서도 실행할 수 있도록 허용해주는 속성이다.
  • @autoclosure 속성은 인자값으로 전달된 일반 구문이나 함수 등을 클로저로 래핑(Wrapping)한다. 쉽게 말해 이 속성이 붙어 있다면 컴파일러가 알아서 클로저로 만들어 사용한다는 의미이다.
profile
개발자

0개의 댓글