2017-03-25 13 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'プロパティを' lazy'にすることも可能です。 –

答えて

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

私は訂正しました。プレーンなクロージャが実際に動作します。私はそれを期待していませんでしたが、それはクラスの宣言の一部なので、コンパイラはそれをオブジェクトに結びつけ、そのために "自己"を持っていると思います。 –

関連する問題