클로저란?
- 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저
- 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저
- 이름 없는 클로저
클로저 축약
- 컨텍스트에서 파라미터와 반환값 타입 유추
- 단일 표현식 클로저의 암시적 반환
- 약식 인자 이름
- 후행 클로저 구문
함수를 클로저로 표현 예시
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func red(name: String) -> String {
return name
}
red(names[0])
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var red = { (name: String) -> String in
return name
}
red(names[0])
func red(_ a: Int, _ b: Int) -> Bool {
return a > b ? true : false
}
let red = { (a: String, b: String) -> Bool in
return a > b ? true : false
}
클로저 축약 예시
var reversedNames = names.sorted(by: red)
func red(name: String) -> String {
return name
}
var reversedNames = names.sorted(by: { (a, b) in
return a > b
}
var reversedNames = names.sorted(by: { (a, b) in a > b } )
var reversedNames = names.sorted(by: { $0 > $1 } )
var reversedNames = names.sorted { $0 > $1 }
func doAnything(_ s1: String, _ s2: String) -> String {
return s1 + s2
}
names.reduce("") { $0 + $1 }
map 뒤에도 클로저로 사용 가능
let digitNames = [
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]
let strings = numbers.map { (number) -> String in
var number = number
var output = ""
repeat {
output = digitNames[number % 10]! + output
number /= 10
} while number > 0
return output
}