클로저
코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있음
일급 객체란?
전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수 도 있다.
/*
{ (매개 변수) -> 리턴 타입 in
실행 구문
}
*/
let hello = { () -> () in
print("hello")
}
hello() // hello
let hello2 = { (name: String) -> String in
return "Hello, \(name)"
}
hello2(name: "Gunter") // error
hello("Gunter") // ✅
func doSomething(closure: () -> ()) {
closure()
}
doSomething(closure: { () -> () in
print("hello")
})
반환 타입
func doSomething2() -> () -> () {
return { () -> () in
print("hello4")
}
}
doSomething()()
doSomething() {
print("hello2")
}
doSomething {
print("hello2")
}
func doSomething2(success: () -> (), fail: () -> ()) {
}
doSomething2 {
} fail: {
}
문법 간소화
doSomething3(closure: (Int, Int, Int) -> Int) {
closure(1,2,3)
}
doSomething3(closure: { (a, b, c) in
return a+b+c
})
doSomething3(closure: {
return $0+$1+$2
})
doSomething3(closure: {
$0+$1+$2
}
doSomething3 {
$0+$1+$2
}
고차함수
다른 함수를 전달 ㅇ니자로 받거나 함수 실행의 결과를 함수로 반환하는 함수
- map
- filter
- reduce
map
let numbers = [0,1,2,3]
let mapArray = numbers.map { (number) -> Int in
return number * 2
})
filter
let intArray = [10, 5, 20, 13, 4]
let filterArray = intArray.filter { $0 > 5 }
print("filter \(filterArray)") // filter [10, 20, 13]
reduce
let someArray = [1,2,3,4,5]
let reduceResult = someArray.reduce(0) {
(result: Int, element: Int) -> Int in
print("\(result) + \(element)")
return result + element
}
print("reduce \(reduceResult)")