Het delegate-patroon is een van de sleutelconcepten in het Swift-ecosysteem, dat veel wordt gebruikt voor het overdragen van de verantwoordelijkheid voor het afhandelen van gebeurtenissen tussen objecten. Delegatie stelt een klasse in staat om een deel van zijn gedrag aan een ander object (de delegate) over te dragen, dat doorgaans is gedefinieerd via een protocol.
protocol DataUpdateDelegate: AnyObject { func didUpdateData(_ data: String) } class DataProvider { weak var delegate: DataUpdateDelegate? func updateData() { // ... logica voor het bijwerken van gegevens delegate?.didUpdateData("Nieuwe gegevens") } } class ViewController: UIViewController, DataUpdateDelegate { func didUpdateData(_ data: String) { print("Gegevens zijn bijgewerkt: \(data)") } }
weak (of unowned) zijn om een retain cycle te voorkomen.AnyObject om weak-referenties toe te staan.Hoe implementeer je delegatie als je delegate een value type (bijvoorbeeld struct) is?
Antwoord:
In Swift moeten delegaten referentietypen zijn (class of AnyObject), omdat alleen referentietypen toegestaan zijn voor weak-verwijzingen. Een struct of enum kan niet als delegate fungeren, anders ontstaan er problemen: de compiler staat het niet toe om een weak-eigenschap te gebruiken, en een strong-referentie leidt tot een retain cycle.
// Fout! Je kunt de delegate niet als struct declareren: de compiler laat niet toe dat deze weak is protocol StructDelegate { ... } struct MyStructDelegate: StructDelegate { ... } weak var delegate: StructDelegate? // Fout
Verhaal
In een project vergat men de eigenschap van de delegate als weak te markeren. Dit leidde tot een retain cycle tussen de view en de delegate, wat resulteerde in geheugenproblemen en het crashen van de applicatie na een halfuur gebruik.
Verhaal
De delegate werd geïmplementeerd als een value type (struct), in plaats van een klasse. De IBOutlet, die de delegate moest zijn, ontving geen meldingen — er was helemaal geen connectie. Het probleem werd pas ontdekt na een loganalyse en debuggen.
Verhaal
In een project erfde het delegate-protocol niet van AnyObject, maar werd de delegate-eigenschap als weak var gedeclareerd. Dit leidde tot een compilerfout, die de team veel tijd kostte om te begrijpen en op te lossen.