클로저 (Closure)
- https://en.wikipedia.org/wiki/Closure_(computer_programming)
- 익명함수
- C, C++, Objective-C의 block
- Java의 Lambda function
- C#의 Delegates
- 코드 블록
- 변수나 상수에 저장할 수 있음
- 다른 함수에 전달할 수 있음
- 함수로부터 반환할 수도 있음
- 비동기 작업이나 콜백을 처리할 때 유용
let greeting = { print("안녕하세요!") }
greeting() // 안녕하세요!

여기서 add1의 자료형은 let add1: (Int, Int) -> Int
함수를 클로저로 변경
함수 버전
func add(x: Int, y: Int) -> Int {
return(x+y)
}
print(add(x:10, y:20))
클로저 버전
let add1 = { (x: Int, y: Int) -> Int in
return(x+y)
}
클로저 일반 형식
{(<매개변수 이름>: <매개변수 타입>, … ) -> <반환 타입> in
// 클로저 표현식 코드
}
호출 예시
print(add1(x:10, y:20)) // 주의 error: extraneous(관련 없는) argument labels 'x:y:' in call
print(add1(10, 20)) // OK
print(type(of:add1)) // 과제
후행 클로저(trailing closure)
- 클로저가 함수의 마지막 argument라면, 마지막 매개변수명(cl)을 생략한 후 함수 소괄호 외부에 클로저를 작성
- https://docs.swift.org/swift-book/LanguageGuide/Closures.html
func someFun(cl: () -> Void) {
}
// trailing closure를 사용 안하면
someFun(cl: {
// closure’s body
})
// trailing closure 사용
someFun() {
// trailing closure's body goes here
}
정의를 뒤에 할 수 있음.
//1
result = math(x: 10, y: 20, cal: {(a: Int, b: Int) -> Int in
return a + b
}) //클로저 소스를 매개변수에 직접 작성
//2
result = math(x: 10, y: 20) {(a: Int, b: Int) -> Int in
return a + b
} //후행 클로저(trailing closure)
둘의 작동은 똑같지만 후행 클로저가 보기 편하기 때문에 2번째를 선호함.
1번째는 함수 실행과 정의를 동시에 하는 것처럼 보여서 이상함.(작동은 잘 되긴 함.)