
1. 클로저
- Swift에서 클로저는 일회용 함수를 작성할 수 있는 구문이다.
2. 클로저 표현식
- 클로저 표현식은 함수와 달리 생략되는 부분이 많다.
- 하지만 형태에 따라 간결성과 가독성이 달라지므로 주의해야 한다.
let f = { () -> Void in
print("클로저가 실행됩니다")
}
f()
({ () -> Void in
print("클로저가 실행됩니다")
})()
let c = { (s1: Int, s2: String) -> Void in
print("s1:\(s1), s2:\(s2)")
}
c(1, "closure")
3. 경량문법
- 클로저 표현식은 주로 인자값으로 사용되는 객체인 만큼, 간결성을 극대화하기 위해 생략할 수 있는 구문들로 이루어져 있다. 필요에 따라 여러 부분을 생략이 가능하다.
var value = [1,9,5,7,3,2];
func order(s1: Int, s2: Int) -> Bool {
if s1 > s2 {
return true;
} else {
return false;
}
}
value.sort(by: order);
value.sort(by: {
(s1: Int, s2: Int) -> Bool in
if s1 > s2 {
return true;
} else {
return false;
}
});
value.sort(by: { (s1: Int, s2: Int) -> Bool in return s1 > s2 });
value.sort(by: >);
4. 트레일링 클로저
- 함수의 마지막 인자값이 클로저일 때, 이를 인자값 형식으로 작성하는 대신 함수의 뒤에 꼬리처럼 붙일 수 있는 문법을 의미한다.
- 주의해야하는 점은 이 문법이 함수의 마지막 인자값에만 적용된다.
5. @escaping과 @autoescape
- @escaping 속성은 인자값으로 전달된 클로저를 전달해 두었다가 나중에 다른 곳에서도 실행할 수 있도록 허용해주는 속성이다.
- @autoclosure 속성은 인자값으로 전달된 일반 구문이나 함수 등을 클로저로 래핑(Wrapping)한다. 쉽게 말해 이 속성이 붙어 있다면 컴파일러가 알아서 클로저로 만들어 사용한다는 의미이다.