[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 속성이 가지는 주요한 특징