클로저는 코드에서 일급 객체로 취급되는 익명 함수로, 변수나 상수에 할당하거나 다른 함수에 인자로 전달할 수 있다. 클로저는 함수와 비슷한 역할을 하며, 클로저는 함수와 유사하지만 매개변수 이름을 생략할 수 있고, 참조를 캡처하여 사용할 수 있다.
//클로저의 종류
// Named Closure
// Unnamed Closure
// Named Closure -> 이름이 있는 함수
func doSomething(){
print("hi")
}
// Unnamed Closure -> 이름이 없는 함수 : 보통 클로저하면 이름이 없는 함수를 말하긴 함
let closure = { print("hi")}
// in 키워드는 매개변수와 반환 타입 선언 부분을 실행 코드 부분과 구분해 준다.
{ (매개변수들) -> 반환타입 in
실행할 코드
}
let sayHello = { (name: String) -> String in
return "Hello, \(name)!"
}
print(sayHello("Alice"))
func performAction(action: () -> Void){
action()
}
performAction{
print("Action")
}
Swift는 클로저의 간소화를 지원하기 때문에 간소하게 작성할 수 있다.
1. 매개변수와 반환 타입 추론 : 클로저가 매개변수로 전달될 때는 타입을 추론할 수 있기 때문에 타입을 생략할 수 있다.
2. 축약 인수 이름 사용: $0, $1등 축약 이름으로 매개변수를 간단히 참조할 수 있습니다.
3. 단일 표현식: 클로저가 한 줄일 경우 return 키워드를 생략할 수 있습니다.
let numbers = [5, 3, 6, 1, 9]
// $0 < $1은 첫 번째 요소와 두 번째 요소의 비교
let sortedNumbers = numbers.sorted(by: {$0 < $1})
print(sortedNumbers)
-> 클로저는 자신이 선언된 문맥의 상수와 변수를 캡처하여, 그 이후에도 해당 값에 접근할 수 있다.
func makeIncrementer(incrementAmount: Int) -> () -> Int{
var total = 0
// 클로저 부분
let incrementer: () -> Int = {
total += incrementAmount
return total
}
// 쿨로저 반환
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo())
print(incrementByTwo())
sorted, filter, map