Das Delegationsmuster (Delegation) ist eines der zentralen Muster im Swift-Ökosystem, das häufig zur Übertragung der Verantwortung für die Verarbeitung von Ereignissen zwischen Objekten verwendet wird. Delegation ermöglicht es einer Klasse, einen Teil ihres Verhaltens an ein anderes Objekt (Delegat) zu delegieren, das in der Regel über ein Protokoll definiert wird.
protocol DataUpdateDelegate: AnyObject { func didUpdateData(_ data: String) } class DataProvider { weak var delegate: DataUpdateDelegate? func updateData() { // ... Logik zur Aktualisierung der Daten delegate?.didUpdateData("Neue Daten") } } class ViewController: UIViewController, DataUpdateDelegate { func didUpdateData(_ data: String) { print("Daten aktualisiert: \(data)") } }
weak (oder unowned) sein, um einen Retain Cycle zu vermeiden.AnyObject abgeleitet, um weak-Referenzen zuzulassen.Wie implementieren Sie die Delegation, wenn Ihr Delegat ein Value Type (z.B. struct) ist?
Antwort:
In Swift müssen Delegaten Referenztypen (class oder AnyObject) sein, da nur Referenztypen für weak-Referenzen zulässig sind. Ein struct oder enum kann nicht als Delegat fungieren, da ansonsten Probleme auftreten: Der Compiler erlaubt es nicht, eine weak-Eigenschaft zu verwenden, und eine Strong-Referenz führt zu einem Retain Cycle.
// Fehler! Delegat kann nicht als struct deklariert werden: der Compiler erlaubt es nicht, ihn weak zu machen protocol StructDelegate { ... } struct MyStructDelegate: StructDelegate { ... } weak var delegate: StructDelegate? // Fehler
Geschichte
In einem Projekt wurde vergessen, die Delegateigenschaft als weak zu kennzeichnen. Dies führte zu einem Retain Cycle zwischen der View und dem Delegaten, die Anwendung begann, allmählich im Speicher „aufgebläht“ zu werden und stürzte nach einer halben Stunde ab.
Geschichte
Der Delegat wurde über einen Value Type (struct) implementiert, anstelle einer Klasse. Der IBOutlet, der Delegat werden sollte, erhielt keine Benachrichtigungen - es fand überhaupt keine Verbindung statt. Das Problem wurde erst nach der Analyse von Logs und Debugging entdeckt.
Geschichte
In einem Projekt erbte das Delegatenprotokoll nicht von AnyObject, und die Delegateigenschaft wurde als weak var deklariert. Dies führte zu einem Compilerfehler, den das Team Zeit benötigte, um zu verstehen und zu beheben.