Sobes.tech
Middle+

Ako vytvoriť slabé odkaz na pole, ktoré je protokol?

sobes.tech AI

Odpoveď od AI

Môžete použiť kľúčové slová weak alebo unowned pred deklaráciou poľa protokolového typu.

protocol MyProtocol: AnyObject { // Protokol musí byť obmedzený na triedy
    func doSomething()
}

class MyClass {
    weak var delegate: MyProtocol? // Slabé odkazovanie na pole typu MyProtocol
    unowned var helper: MyProtocol // Ne vlastnické odkazovanie na pole typu MyProtocol (ak ste si istí, že objekt vždy existuje)
}

Dôležité je, že protokol musí byť obmedzený na triedy (: AnyObject), aby bolo možné používať slabé alebo ne vlastnické odkazy. To zabezpečuje, že typ, ktorý implementuje protokol, je referenčný typ, nie hodnotový typ.

Pre pole protokolového typu sa weak aplikuje, keď objekt, na ktorý sa odkazuje pole, môže byť uvoľnený skôr, než objekt, ktorý obsahuje tento odkaz. Ak je referenčný objekt uvoľnený, pole sa automaticky stáva nil.

unowned sa používa, keď ste si istí, že objekt, na ktorý sa odkazuje pole, má vždy rovnaký alebo dlhší životný cyklus než objekt, ktorý obsahuje tento odkaz. Použitie unowned je bezpečné iba vtedy, ak garantujete absenciu cyklických odkazov a ste si istí, že referenčný objekt je vždy platný. Ak je objekt uvoľnený a pokúsite sa k nemu pristúpiť cez unowned odkaz, dôjde k pádu.

Vo väčšine prípadov sa weak používa pre delegátov a iné podobné vzory.