/ / Referenz "self" in Swift-Instanzmitgliedserklärung - swift

Referenz "self" in der Swift-Instanz-Member-Deklaration - swift

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 № 1

Im 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.