[Swift] @autoclosure / 지연된 실행
2022. 8. 31. 23:59ㆍ🍏/Swift
@autoclosure 속성은 인자값으로 전달된 일반 구문이나 함수 등을 클로저로 래핑하는 역할.
이 속성이 붙어 있을 경우, 일반 구문을 인자값으로 넣더라도 컴파일러가 알아서 클로저로 만들어서 사용.
var customersInLine = [String]()
func addVars(fn: @autoclosure () -> Void) {
customersInLine = Array(repeating: "", count: 3)
customersInLine.append("HIHI")
fn()
}
addVars(fn: customersInLine.insert("CHAN", at: 0))
// 지연된 실행과 autoclosure
var customerProviders: [() -> String] = [] // 클로저를 저장하는 배열을 선언
func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String,_ sw: Bool) {
if sw == true {
customerProviders.append(customerProvider)
}
} // 클로저를 인자로 받아 그 클로저를 customerProviders 배열에 추가하는 함수를 선언
collectCustomerProviders(customersInLine.remove(at: 0), false)
collectCustomerProviders(customersInLine.remove(at: 0), true) // 클로저를 customerProviders 배열에 추가
collectCustomerProviders(customersInLine.removeLast(), 3>2) // 클로저를 customerProviders 배열에 추가
print("Collected \(customerProviders.count) closures.")
// Prints "Collected 2 closures." // 2개의 클로저가 추가 됨
for customerProvider in customerProviders {
print("Now serving \(customerProvider())!") // 클로저를 실행하면 배열의 0번째 원소를 제거하며 그 값을 출력
}
@autoclosure 속성이 인자값에 부여되면 해당 인자값은 컴파일러에 의해 클로저로 자동 래핑.
그러무로 함수를 실행할 때 '{}'형식 클로저가 아닌 '()'형식의 일반값을 인자값으로 사용.
또한 인자값은 코드에 작성된 시점이 아닌 해당 클로저가 실행되는 시점에 맞추어 실행.
이를 지연된 실행이라 부르며, @autoclosure 속성이 가지는 주요한 특징
'🍏 > Swift' 카테고리의 다른 글
[Swift] 세트 / Set (0) | 2022.09.01 |
---|---|
[Swift] 배열 / Array (0) | 2022.09.01 |
[Swift] @escaping Closure / escape 클로저 (1) | 2022.08.31 |
[Swift] 트레일링 클로저 / Trailing Closure (0) | 2022.08.26 |
[Swift] 자동 참조 카운트 / ARC / Auto Referencing Counter (0) | 2022.08.26 |