2014-12-15 6 views
3

클로저와 함수가 같은 것이라고 생각했습니다. 그러나 로컬 함수 컴파일러 내부의 속성을 참조 할 때 자체를 요구하지는 않습니다. 그러나 내부 종결은 자필을 써야합니다. 왜이 두 가지가 다른가요? 선명도왜 컴파일러는 클로저와 로컬 함수를 다르게 처리합니까?

샘플 코드는 : closure는 인스턴스 속성에 액세스 만의 그것에 대해 생각하게하는 신속한에서 자기가 필요한 이유를 실제로

class Foo { 
    let bar = "bar" 

    func baz() { 
     func localBaz() { 
      println(bar) // No complain from compiler. 
     } 

     let bazClosure = { 
      println(self.bar) // Here if I write just println(bar), compiler complains. 
     } 
    } 
} 

답변

2

기대가 잘못되었습니다. Swift의 기능과 클로저는 똑같지 않습니다. func은 본질적으로 [unowned self] 선언으로 lazy var 바인딩을 설정합니다. 따라서, 당신이 원하는 경우 다음을 변환 할 수 func 없애 :

class Foo { 
    let bar = "bar" 
    // this is not your 'baz'; just an example 
    func baz() { println (bar) } 
    } 
} 

당신은 func 그냥 폐쇄 이상을하고있는 것을 볼 수 있습니다

class Foo { 
    let bar = "bar" 
    lazy var baz = { [unowned self] in println (self.bar) } 
} 

한다.

또한 중요한 것은 funcfunc bar의 본문이 bar을 참조 할 수 있도록하는 재귀 적 바인딩 환경을 설정한다는 것입니다. 따라서 당신은 쓸 수 있습니다 :

1> class Foo { 
    2.  func fact (x:Int) -> Int { 
    3.   if 1 == x { return x } 
    4.   else { return x * fact (x - 1) }} 
    5. }  
    6> Foo().fact(5) 
$R0: (Int) = 120 

하지만

7> class Foo { 
    8.  lazy var fact = { (x:Int) -> Int in 
    9.   if 1 == x { return x } 
10.   else { return x * fact (x - 1) }}} 
repl.swift:10:27: error: variable used within its own initial value 
     else { return x * fact (x - 1) }}} 

        ^
+1

당신은 그들이 같은 것이 아니다 맞다합니다. Apple의 신속한 책에서 "기능에 도입 된 전역 및 중첩 기능은 실제로 클로저의 특수한 경우입니다." 그러나 지금까지 나는이 우주적인 사건이 무엇인지 알지 못했다. 유용한 정보를 가져 주셔서 감사합니다. – mustafa

+0

공평하게 말하자면, 저는 이것들이 * 똑같은 것을 보여주기 위해서라고 생각합니다. 그리고 func은 클로저 표현식을 이름에 바인딩하는 것의 축약이고, '. –

0

, 나도 몰라.

baz()은 클래스 기능이며, 외부 함수처럼 Foo 클래스와 closure 클래스에 속함을 의미합니다. Objective-C에서 모든 클래스 함수는 실제로 해당 함수를 호출하기 위해 self 인수가 필요합니다.

그러므로 closureself 포인터 (또는 인스턴스를 참조하십시오. Foo 참조)가 해당 속성에 액세스해야합니다.

관련 문제