Sobes.tech
Middle+

Kaip galima sukurti silpną nuorodą į lauką, kuris yra protokolas?

sobes.tech AI

Atsakymas iš AI

Galite naudoti raktinius žodžius weak arba unowned prieš deklaruojant protokolo tipo lauką.

protocol MyProtocol: AnyObject { // Protokolas turi būti apribotas klasėms
    func doSomething()
}

class MyClass {
    weak var delegate: MyProtocol? // Silpnas nuoroda į `MyProtocol` tipo lauką
    unowned var helper: MyProtocol // Ne nuosavybinė nuoroda į `MyProtocol` tipo lauką (jei esate tikras, kad objektas visada egzistuoja)
}

Svarbu pažymėti, kad protokolas turi būti apribotas klasėms (: AnyObject), kad būtų galima naudoti silpną arba ne nuosavybinę nuorodą. Tai užtikrina, kad protokolą įgyvendinantis tipas yra nuorodinis tipas, o ne reikšmės tipas.

Protokolo tipo lauke weak taikoma, kai objektas, į kurį nurodo laukas, gali būti paleistas anksčiau nei objektas, turintis šią nuorodą. Jei nurodytas objektas yra paleistas, laukas automatiškai tampa nil.

unowned taikoma, kai esate tikras, kad objektas, į kurį nurodo laukas, visada turi tą patį arba ilgesnį gyvavimo ciklą nei objektas, turintis šią nuorodą. unowned naudojimas yra saugus tik tada, kai garantuojate, kad nėra ciklinių nuorodų ir esate tikras, kad nurodytas objektas visada yra galiojantis. Jei objektas yra paleistas ir bandysite prieiti prie jo per unowned nuorodą, įvyks avarija.

Daugeliu atvejų weak naudojamas delegatams ir kitiems panašiems modeliams.