2017-03-25 2 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() {} 
} 

Warum ist self in der internen Variablen foo nicht aufgelöst?Warum ist das Selbst ungelöst?

Was mache ich hier falsch?

+3

Dies ist das gleiche Problem wie in [So initialisieren Sie Eigenschaften, die voneinander abhängen] (http://stackoverflow.com/questions/25854300/how-to-initialize-properties-that-depend-on-e-ach- andere). Die 'foo' Eigenschaft' faul' zu machen ist eine mögliche Lösung. –

Antwort

0

Die Schließung, die Sie foo zuweisen, ist unabhängig von Ihrer LMAO-Klasse, also hat sie kein "self".

Wenn Sie Ihre Foo-Variable mit Code aus dem Selbst der aktuellen Instanz initialisieren möchten, müssen Sie die Lazy-Initialisierung verwenden. Sie müssen auch irgendwie mit der aktuellen Instanz verlinken (eine einfache Schließung wird es nicht tun).

der einfachste Weg wäre wahrscheinlich eine defaultFoo Funktion Ihrer Klasse und weisen Sie als Anfangswert hinzuzufügen:

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

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

    func rofl() {} 
} 

An diesem Punkt werden Sie wahrscheinlich eine optionale sein nicht foo müssen, aber das ist wie du willst.

+0

Mit "eine einfache Schließung" funktioniert, benötigen Sie keine Methode. – Hamish

+0

Ich stehe korrigiert. Ein einfacher Verschluss funktioniert tatsächlich. Ich habe das nicht erwartet, aber da es Teil der Deklaration der Klasse ist, denke ich, dass der Compiler es mit dem Objekt verbindet und somit ein "Selbst" hat, mit dem man arbeiten kann. –