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.