Closures
클로저는 자신이 선언된 컨텍스트로부터 상수나 변수 저장하고, 붙잡아 둘수 있습니다.
-
클로저의 형태
- 전역함수는 이름을가진 클로저의 형태이고 , 값을 붙잡아 둘 수 없습니다.
- 중첩함수는 이름을 가진 클로저의 형태이고 , 자신을 가지고 있는 함수의 값을 붙잡아 둘 수 있습니다.
- 클로저표현식은 이름을 가지지 않은 클로저의 형태이고 , 자신 주위 컨텍스트의 값을 붙잡아 둘 수 있습니다.
-
Closure Expression Syntax - 클로저 표현식
-
{ (parameters) -> return type in statements }
정수형 배열을 문자열 배열로 변환하기
-
함수를 이용한 정렬
-
var numbers = [9,3,2,4,1,5,8,7,6,0] func asendingOrder(_ a:Int,_ b:Int) -> Bool { return a < b } numbers.sorted(by: asendingOrder(_:_:))
-
클로저 표현식으로 정렬
-
numbers.sorted(by:{ (a:Int,b:Int) -> Bool in return a < b })
-
매개변수 타입생략
-
numbers.sorted(by: { a,b in return a < b } ) // sort에 들어올 클로저 타입이 명시 되어 있으므로 생략가능하다.
-
단일 표현식에서의 반환 생략
-
numbers.sorted(by:{ a,b in a < b}) // 단순한 표현식일시 return 키워드 생략이 가능하다.
-
트레일링 클로저 표현
-
numbers.sorted{ a,b in a < b } // 매개변수로 클로저를 받을시 마지막 매겨변수가 클로저이면 트레일링 클로저로 표현할 수 있다.
-
속기 이름 표현
-
numbers.sorted{ $0 < $1 }
Escaping Closures
-
var store = [ () -> Void ]() func callEscapingClosure(closure: @escaping () -> Void ){ store.append(closure) closure() } store.append{ print(10) } // 탈출 가능한 클로저를 만드는 방법은 외부변수에 저장하는 것입니다.
-
구조체에서 사용해보기
-
func callEscapingClosure(closure: @escaping () -> Void ){ store.append(closure) closure() } func callNonEscapingClosure(closure: () -> Void ){ closure() } struct Escaping{ let x = 10 func test(){ callEscapingClosure { print(self.x) // @escaping 에서 self 명시적으로 참조해야 함을 의미합니다 // 외부의 클로저이므로 self 키워드를 붙여주지 않으면 x 의 컨텍스트를 가늠할 수 없다. } callNonEscapingClosure { print(x) } } } Escaping().test()
Auto Closures
- 매개변수를 가지고 있지 않다.
- 호출될 때 까지 실행되지 않는다.
var waitingCustomers = ["부엉이","올빼미","금붕어","병아리","아기상어"]
let currentCustomer = { waitingCustomers.remove(at: 0) } // Auto closure
let newCustomer = { waitingCustomers.append($0) }
func nextCustomer( process: @autoclosure () -> String){
print("현재손님은 \(process())")
}
newCustomer("오리") // 호출되어 실행
print(watingCustomers) // print: ["부엉이", "올빼미", "금붕어", "병아리", "아기상어", "오리"]
nextCustomer(process: currentCustomer()) // print: 현재손님은 부엉이
print(watingCustomers) // print: [올빼미", "금붕어", "병아리", "아기상어", "오리"]
nextCustomer(process: currentCustomer()) // print: 현재손님은 올빼미
print(watingCustomers) // print: ["금붕어", "병아리", "아기상어", "오리"]