클로저란 이름이 없는 함수(익명함수)로,
함수보다 더 큰 범주에 속하며 형태만 다릅니다.
또한 프로토콜과 함께 1급 객체로 사용할 수 있습니다.
클로저의 형태로는 두 가지가 있습니다.
func namedClosure() {}
일반적인 함수의 형태가 named closure라고 할 수 있습니다.
let unNamedClosure = { print("TestNumber") }
변수에 할당된 형태로 함수의 이름이 없어 Unnamed Closure라고 합니다.
일반적으로 불리는 클로저는 이 UnNamed의 형태입니다.
기본적인 클로저 표현으로는 파라미터와 return type이
closure의 헤더 부분이고 in 키워드 아래 statements는 클로저의 바디 부분이라고 부릅니다.
let personName = { (name: String) -> String in
return name
}
personName("kim") // kim
personName 변수는 (String) -> String 타입으로
파라미터로 String값을 받으면 그 값을 String으로 리턴하여
"kim"을 반환합니다.
이것이 기본적인 클로저 표현식입니다.
이런 클로저는 간단하게 표현할 수 있는데
함수의 마지막 파라미터가 클로저 형태일때 Argument Label을 생략할 수 있습니다.
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
someFunctionThatTakesAClosure(closure: {
// closure's body goes here
})
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}
someFunctionThatTakesAClosure {
// trailing closure's body goes here
}
func numNumber(closure: (Int, Int, Int) -> Int) {
closure(1, 2, 3)
}
numNumber(closure: { (a: Int, b: Int, c: Int) -> Int in
return a + b + c
})
리턴타입 생략 가능
numNumber(closure: { (a, b, c) in
return a + b + c
})
Parameter Name은 Shortand Argument Names으로 대체하며,
이 경우 Parameter Name과 in 키워드를 삭제
doSomething(closure: {
return $0 + $1 + $2
})
단일 리턴문을 사용할 경우 return 또한 축약 가능.
doSomething(closure: {
$0 + $1 + $2
})
클로저가 마지막 파라미터면 후행 클로저 가능.
doSomething {
$0 + $1 + $2
})
https://babbab2.tistory.com/81
https://docs.swift.org/swift-book/LanguageGuide/Closures.html