Ich habe ein struct
Einrichten, das eine Referenz als einen einzelnen Initialisierungsparameter akzeptiert:
internal struct NodeState: Equatable {
weak var node: Node! = nil
// ...
init(node: Node) {
self.node = node
}
}
Ich möchte ein instanziieren NodeState
als Mitglied der Node
Klasse, vorbei self
um diesen schwachen Bezug zu setzen:
public class Node: NSObject {
internal var state = NodeState(node: self)
// ...
}
… Aber ich bekomme diesen komischen Kompilierungsfehler:
Der Wert des Typs "NSObject -> () -> Node" kann nicht in den erwarteten Argumenttyp "Node" konvertiert werden.
Darf ich nicht referenzieren? self
in einer Mitgliedserklärung in Swift?
Antworten:
3 für die Antwort № 1Im Allgemeinen können Sie nicht referenzieren self
in einer Member-Class-Deklaration können Sie jedoch, wenn Sie die Eigenschaft faul machen und sie mit einer Schließung initialisieren. Ändern Sie Ihre Node
klasse so etwas sollte funktionieren:
public class Node: NSObject {
internal lazy var staticState: NodeState = { NodeState(node: self) }()
}
Es funktioniert, weil die Lazy-Eigenschaft erst danach initialisiert wird self
wird initialisiert. self
muss vollständig initialisiert werden, bevor es verwendet werden kann.
2 für die Antwort № 2
Darf ich mich in einer Mitgliedserklärung in Swift nicht auf sich selbst beziehen?
Art von. Sie können nicht referenzieren self
(z. B. Methoden aufrufen, self als Parameter übergeben), bis das Objekt vollständig initialisiert ist
Sie könnten in diesem Fall eine Lazy-Var verwenden, die funktionieren würde, da auf sie nicht zugegriffen werden kann, bis das Objekt initialisiert ist. Hier ein Beispiel:
public class Node: NSObject {
internal lazy var staticState: NodeState = {
return NodeState(node: self)
}()
}
1 für die Antwort № 3
Referenz selbst in einer Schließung?
public class Node: NSObject {
lazy var staticState: () -> (NodeState) = {
[unowned self] in
return NodeState(node: self)
}
}
Ich verziere ausdrücklich self
wie unowned
im Verschluss, um einen Retentionszyklus zu verhindern.