Sobes.tech
Middle+

Hoe maak je een zwakke verwijzing naar een veld dat een protocol is?

sobes.tech AI

Antwoord van AI

Je kunt de sleutelwoorden weak of unowned gebruiken voordat je een veld van protocoltype declareert.

protocol MyProtocol: AnyObject { // Het protocol moet beperkt zijn tot klassen
    func doSomething()
}

class MyClass {
    weak var delegate: MyProtocol? // Zwakke verwijzing naar een veld van type MyProtocol
    unowned var helper: MyProtocol // Niet-eigen verwijzing naar een veld van type MyProtocol (als je zeker weet dat het object altijd bestaat)
}

Het is belangrijk op te merken dat het protocol beperkt moet zijn tot klassen (: AnyObject) om zwakke of niet-eigen verwijzingen te kunnen gebruiken. Dit garandeert dat het type dat het protocol implementeert een referentietype is, geen waardetype.

Voor het protocoltype-veld wordt weak toegepast wanneer het object waarnaar het veld verwijst, eerder kan worden vrijgegeven dan het object dat deze verwijzing bevat. Als het referentieobject wordt vrijgegeven, wordt het veld automatisch nil.

unowned wordt gebruikt wanneer je zeker weet dat het object waarnaar het veld verwijst, altijd hetzelfde of een langer levenscyclus heeft dan het object dat deze verwijzing bevat. Het gebruik van unowned is alleen veilig als je de afwezigheid van cyclische verwijzingen garandeert en zeker bent dat het referentieobject altijd geldig is. Als het object wordt vrijgegeven en je probeert er via een unowned-verwijzing toegang toe te krijgen, zal er een crash plaatsvinden.

In de meeste gevallen wordt weak gebruikt voor delegates en andere soortgelijke patronen.