Sobes.tech
Junior — Middle

Létrehozható-e gyenge hivatkozás egy protokollt megvalósító tulajdonságra?

sobes.tech MI

Válasz az MI-től

Swiftben nem lehet gyenge (weak) hivatkozást létrehozni egy olyan tulajdonságra, amely protokollt valósít meg, ha ez a protokoll nincs korlátozva osztályokra (class-only protocol). Ez azért van, mert a gyenge hivatkozások csak referenciatípusokra (osztályokra) alkalmazhatók, míg a protokollokat mind osztályok, mind szerkezetek vagy enumerációk megvalósíthatják.

Ahhoz, hogy gyenge hivatkozást használjunk egy protokoll típusú tulajdonsághoz, korlátozni kell a protokollt az AnyObject öröklésével, például:

protocol MyProtocol: AnyObject {
    func doSomething()
}

class MyClass: MyProtocol {
    func doSomething() {
        print("Valamit csinálok")
    }
}

class AnotherClass {
    weak var delegate: MyProtocol?
}

Ha a protokoll nincs korlátozva az AnyObject-re, akkor nem lehet gyenge hivatkozást létrehozni, és erős hivatkozásokat vagy más memória kezelés mechanizmusokat kell használni.