Sobes.tech
Middle+

Wie kann man eine schwache Referenz auf ein Feld erstellen, das ein Protokoll ist?

sobes.tech KI

Antwort von AI

Es können die Schlüsselwörter weak oder unowned vor der Deklaration eines Feldes vom Protokolltyp verwendet werden.

protocol MyProtocol: AnyObject { // Das Protokoll muss auf Klassen beschränkt sein
    func doSomething()
}

class MyClass {
    weak var delegate: MyProtocol? // Schwache Referenz auf ein Feld vom Typ MyProtocol
    unowned var helper: MyProtocol // Nicht-eigenschaftliche Referenz auf ein Feld vom Typ MyProtocol (wenn Sie sicher sind, dass das Objekt immer existiert)
}

Es ist wichtig zu beachten, dass das Protokoll auf Klassen beschränkt sein muss (: AnyObject), um schwache oder nicht-eigenschaftliche Referenzen verwenden zu können. Dies stellt sicher, dass der Typ, der das Protokoll implementiert, ein Referenztyp ist und kein Werttyp.

Für das Feld vom Protokolltyp wird weak angewendet, wenn das Objekt, auf das sich das Feld bezieht, vor dem Objekt, das diese Referenz enthält, freigegeben werden kann. Wenn das referenzierte Objekt freigegeben wird, wird das Feld automatisch nil.

unowned wird verwendet, wenn Sie sicher sind, dass das Objekt, auf das sich das Feld bezieht, immer die gleiche oder eine längere Lebensdauer hat als das Objekt, das diese Referenz enthält. Die Verwendung von unowned ist nur sicher, wenn Sie die Abwesenheit von zirkulären Referenzen garantieren und sicher sind, dass das referenzierte Objekt immer gültig ist. Wenn das Objekt freigegeben wird und Sie versuchen, darauf über eine unowned-Referenz zuzugreifen, tritt ein Absturz auf.

In den meisten Fällen wird weak für Delegierte und andere ähnliche Muster verwendet.