SW

자동 클로저 (학습) 본문

프로그래밍/Swift

자동 클로저 (학습)

LCD 2018. 10. 17. 17:47

자동 클로저 : 함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저를 자동 클로저 라고 한다.

자동 클로저는 전달인자를 갖지 않는다.

자동 클로저는 호출 되었을 때 자신이 감싸고 있는 코드의 결괏값을 반환한다.

자동 클로저는 함수로 전달하는 클로저를 (소괄호와 중괄호를 겹쳐서 써야하는) 어려운 클로저 문법을 사용하지 않고도 클로저로 사용할 수 있도록 문법적 편의를 제공한다.





자동 클로저는 호출되기 전까지는 클로저 내부의 코드가 동작하지 않는다. 따라 연산을 지연시킬 수 있다.


아래 예제코드를 보며 확인해 보자



var customersInLine: [String] = ["YoangWha", "SanggGon", "SungHe", "Romi"]

print(customersInLine.count)    // 4


let customerProvider: () -> String = {

    return customersInLine.removeFirst()

}


print(customersInLine.count)        // 4


print("Now serving \(customerProvider())!")

print(customersInLine.count)        //3

print("Now serving \(customerProvider())!")

print(customersInLine.count)        //2

print("Now serving \(customerProvider())!")

print(customersInLine.count)        //1

print("Now serving \(customerProvider())!")

print(customersInLine.count)        //0



배열(Array)에서 removeFirst() 메서드는 자신의 배열에서 첫 번째 요소를 제거하면서 그 요소를 반환해주는 메서드이다. (복습했다..)


그래서 customerProvider()를 선언하였지만 바로 아래서 호출된 카운트에서는 연산 자체가 반영되지 않았다.


바로 다음의 print("Now serving \(customerProvider())!")으로 실행 시킴으로써 카운트에 반영되는 것을 확인 할 수 있다.


클로저가 호출 되지 않으면 영영 내부코드가 실행되지 않기 때문에 연산을 실행하지 않는다는 것을 확인 했다. 이는 연산 자원을 많이 소모한다거나 부작용이 우려되는 경우 유용하게 쓸 수 있을 것 같다. 라고 한다.



---

함수형식으로 전달한다고 하고 만들면 아래 예제 처럼 된다.


var customersInLine: [String] = ["YoangWha", "SanggGon", "SungHe", "Romi"]

print(customersInLine.count)    // 4



func serveCustomer(_ customerProvider: () -> String) {

    print("Now serving \(customerProvider())!")

}


serveCustomer({customersInLine.removeFirst() }) // "Now serving YoangWha"

print(customersInLine.count)     // 3


serveCustomer( _ : ) 함수는 클로저를 매개변수로 전달받고 있다.


암시적 표현으로 인해서 위든 아래든 retrun 키워드를 생략할 수 있다.


var customersInLine: [String] = ["YoangWha", "SanggGon", "SungHe", "Romi"]

print(customersInLine.count)    // 4



func serveCustomer(_ customerProvider: @autoclosure () -> String) {

    print("Now serving \(customerProvider())!")

}


serveCustomer(customersInLine.removeFirst())

print(customersInLine.count)






복습이 필요할 것 같다.


어렵다 프로그래밍...

'프로그래밍 > Swift' 카테고리의 다른 글

옵셔널 이해하기 (복습)  (0) 2018.10.21
클로저 탈출  (1) 2018.10.17
클로저 값 획득 (복습)  (0) 2018.10.17