Middle
Πώς μπορεί να δημιουργηθεί μια αδύναμη αναφορά σε μια μεταβλητή τύπου πρωτοκόλλου στο Swift;
sobes.tech AI
Απάντηση από AI
Απαιτείται η χρήση της λέξης-κλειδιού weak πριν από την δήλωση μιας μεταβλητής τύπου πρωτοκόλλου. Το πρωτόκολλο πρέπει να δηλώνεται με τρόπο που να εφαρμόζεται μόνο σε κλάσεις: είτε κληρονομώντας από το AnyObject, είτε χρησιμοποιώντας τη λέξη-κλειδί class.
Παράδειγμα με κληρονομία από το AnyObject:
protocol MyDelegate: AnyObject {
func doSomething()
}
class MyClass {
weak var delegate: MyDelegate?
}
Παράδειγμα με τη λέξη-κλειδί class:
protocol AnotherDelegate: class { // Έκδοση μέχρι Swift 4.1
func doSomethingElse()
}
// Στις σύγχρονες εκδόσεις Swift (>= 4.1), αρκεί η κληρονομία από το `AnyObject`
Η χρήση του weak αποτρέπει κυκλικούς ισχυρούς δεσμούς, π.χ. στην ανάθεση, όπου ένα αντικείμενο-ιδιοκτήτης αναφέρεται στον delegate, και αυτός με τη σειρά του αναφέρεται πίσω στον ιδιοκτήτη (ή παρόμοια δομή). Μία αδύναμη αναφορά δεν αυξάνει τον μετρητή αναφορών του αντικειμένου.