Jak można utworzyć słabe odniesienie do pola, które jest protokołem?
sobes.tech AI
Odpowiedź od AI
Możesz używać słów kluczowych weak lub unowned przed deklaracją pola typu protokołu.
protocol MyProtocol: AnyObject { // Protokół musi być ograniczony do klas
func doSomething()
}
class MyClass {
weak var delegate: MyProtocol? // Słaba referencja do pola typu MyProtocol
unowned var helper: MyProtocol // Nieposiadana referencja do pola typu MyProtocol (jeśli jesteś pewien, że obiekt zawsze istnieje)
}
Ważne jest, aby protokół był ograniczony do klas (: AnyObject), aby można było używać słabych lub nieposiadanych referencji. To gwarantuje, że typ implementujący protokół jest typem referencyjnym, a nie typem wartości.
Dla pola typu protokołu, weak stosuje się, gdy obiekt, na który wskazuje pole, może zostać zwolniony wcześniej niż obiekt zawierający tę referencję. Jeśli obiekt referencyjny zostanie zwolniony, pole automatycznie stanie się nil.
unowned stosuje się, gdy jesteś pewien, że obiekt, na który wskazuje pole, zawsze ma ten sam lub dłuższy cykl życia niż obiekt zawierający tę referencję. Użycie unowned jest bezpieczne tylko wtedy, gdy gwarantujesz brak cyklicznych referencji i jesteś pewien, że obiekt referencyjny jest zawsze ważny. Jeśli obiekt zostanie zwolniony, a spróbujesz uzyskać do niego dostęp przez unowned, nastąpi awaria.
W większości przypadków weak jest używany dla delegatów i innych podobnych wzorców.