스위프트 프로그래밍 3판을 보고 정리한 내용입니다.
변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다.
이를 변수나 상수의 클로징이라고 하며 클로저는 여기서 착안된 이름이다.
let names:[String] = ["james","eric","junseole","omega"]
func reveredSort(first : String, second : String) -> Bool{
return first > second
}
let reveredName: [String] = names.sorted(by: reveredSort)
print(reveredName) //["omega", "junseole", "james", "eric"] 출력
let names:[String] = ["james","eric","junseole","omega"]
let reveredName: [String] = names.sorted(by: {(first:String ,second: String) -> Bool in first > second})
print(reveredName) //["omega", "junseole", "james", "eric"] 출력
이러한 방법을 사용할경우 좀 더 간결해지고 직관적인 코드를 작성할 수 있다.
클로저가 조금 길어진다거나 가독성이 조금 떨어진다면 후행클로저 기능을 사용하면 해결할 수 있다.
let names:[String] = ["james","eric","junseole","omega"]
후행 클로저 사용
let reveredName: [String] = names.sorted(){(first:String ,second: String) -> Bool in first > second}
print(reveredName) //["omega", "junseole", "james", "eric"] 출력
// sorted() 메서드의 소괄호까지 생략 가능
let reveredName: [String] = names.sorted{(first:String ,second: String) -> Bool in first > second}
print(reveredName)
//클로저의 매개변수 타입과 반환 타입을 생략하여 표현할 수 있다.
let reveredName: [String] = names.sorted{(first,second) -> Bool in first > second}
// 단축 인자 이름을 사용한 표현
let reveredName: [String] = names.sorted{
return $0 > $1}
// return 을 생략해서 더 줄일 수 있다.
let reveredName: [String] = names.sorted{$0 > $1}
클로저는 자신이 정의된 위치의 주변 문맥을 통해 상수나 변수를 획득 할 수 있다.
이유 : 클로저는 비동기 작업에 많이 사용되기 때문
func makeIncrementer(forIncrement amount :Int) -> (() -> Int){
var runningTotal = 0
func incrementer() -> Int{
runningTotal += amount
return runningTotal
}
return incrementer
}
let incrementByTwo:(() -> Int) = makeIncrementer(forIncrement: 2)
let first:Int = incrementByTwo() //2
let second:Int = incrementByTwo() //4
let third:Int = incrementByTwo() //6
let incrementByTen:(() -> Int) = makeIncrementer(forIncrement: 10)
let ten:Int = incrementByTen() //10
let twenty:Int = incrementByTen() //20
let thirty:Int = incrementByTen() //30
클로저는 참조 타입이다.
함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출될 때 클로저가 함수를 탈출한다고 표현한다.
@escaping 키워드를 사용하여 클로저가 탈출하는 것을 허용한다고 명시해줄 수 있다.
함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저