#@autoclosure
인자로 클로저를 받는 함수를 하나 생각해보자.
func f(pred: () -> Bool) {
if pred() {
println("It's true")
}
}
이 함수를 호출할 때에는 클로져 자체를 넘겨주게 된다.
f({ 2 > 1})
// 혹은
f{2 > 1}
@autoclosure
는 함수의 파라미터를 자동으로 클로져로 감싸면서 호출한 시점의 문맥에서 동작하게 한다. 따라서
f(2 > 1)
로 호출할 수 있다.
이 기능의 의미는 인자로 전달되는 표현식의 평가 시점에 있다. 일반적인 함수 호출 흐름에서는 표현식이 함수의 인자로 들어가게 될 때, 함수는 값을 전달받게 되므로 표현식이 평가된 후에 들어가지만, @autoclosure
에 의해서 자동으로 클로저로 캡쳐되기 때문에 이는 함수 내에서 평가된다.
조금 다른 예제
func Caller() {
var vec = [1,2,3,4,5]
var index = 0
Callee(vec.count, vec[index++])
// index is now 5
}
func Callee(count:Int, @autoclosure item: () -> Int) {
for var i = 0; i < count ; i++ {
println("Hello #(item())")
}
}
/*:
Hello #1
Hello #2
Hello #3
Hello #4
Hello #5
*/