2017-03-25 9 views
1
protocol LOL { 
    var foo: ((_ lol: String) -> Bool)? { get set } 
} 

class LMAO: LOL { 
    internal var foo: ((String) -> Bool)? = { (_ lol: String) in 
     self.rofl() 
     return true 
    } 

    func rofl() {} 
} 

foo 변수에 self이 풀리지 않은 이유는 무엇입니까?왜 자기가 해결되지 않았습니까?

내가 뭘 잘못하고 있니?

+3

이것은 [서로 의존하는 속성을 초기화하는 방법]과 동일한 문제입니다. (http://stackoverflow.com/questions/25854300/how-to-initialize-properties-that-depend-on-each- 다른). 'foo' 속성을'게으른'것으로 만드는 것이 가능한 해결책 중 하나입니다. –

답변

0

foo에 지정하는 클로저는 LMAO 클래스와 독립적이므로 "자체"가 없습니다.

현재 인스턴스의 자체 코드에서 foo 변수를 초기화하려면 지연 초기화를 사용해야합니다. 현재 인스턴스에 어떻게 든 연결해야합니다 (일반 클로저에서는 수행하지 않습니다).

가장 쉬운 방법은 아마도 초기 값으로 클래스에 defaultFoo 기능을 추가하고 지정하는 것입니다 : 당신은 아마 선택을 할 foo는 필요하지 않습니다이 시점에서

class LMAO: LOL 
{ 
    lazy var foo: ((String) -> Bool)? = self.defaultFoo 

    func defaultFoo (_ lol: String) -> Bool 
    { 
    self.rofl() 
    return true 
    } 

    func rofl() {} 
} 

,하지만 그건 너까지.

+0

"plain closure"를 사용하면 메서드가 필요하지 않습니다. – Hamish

+0

나는 고쳐졌다. 일반 클로저가 실제로 작동합니다. 나는 그것을 기대하지 않았지만 클래스의 선언의 일부이기 때문에 컴파일러가 객체에 묶어서 작업 할 "자체"가 있다고 생각한다. –