Swift :: @autoclosure explained

#@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
*/