06 May 2015

Auto-Closures

Swift 오픈 소스 라이브러리들을 살펴보면 가끔 @autoclosure라는 키워드가 보입니다.

Swift에서 closure를 사용할 때는 다음과 같이 함수 형태로 인자를 넘겨주도록 합니다.

func f( pred: () -> Bool ) {
  if pred() {
    println("It`s true")
  }
}

f({ 2 > 1 } )
//or
f{ 2 > 1 }


하지만 @autoclosure를 사용하면 함수 사용할 때 {}를 사용하지 않고 ()를 사용합니다.

func g(@autoclosure pred: () -> Bool ) {
  if pred() {
    println("It`s true")
  }
}

g( 3 > 1 )
//or
g( { 3 > 1 }() )

함수에 인자를 넣어 사용하는 것과 비슷한 형태로 사용할 수 있습니다.

`()`가 아닌 `(Int)` 등 인자를 받고자 하려고 한다면 컴파일러가 `Autoclosure argument type must be '()'`로 에러를 보여줍니다. 따라서 인자를 추가할 수 없습니다.

또한, assert 함수도 @autoclosure 형태로 구현되어 있음을 확인할 수 있습니다.

func assert(condition: @autoclosure () -> Bool, 
	_ message: @autoclosure () -> String = default, 
	file: StaticString = default, 
	line: UWord = default)

참고 자료