Sobes.tech
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, και αυτός με τη σειρά του αναφέρεται πίσω στον ιδιοκτήτη (ή παρόμοια δομή). Μία αδύναμη αναφορά δεν αυξάνει τον μετρητή αναφορών του αντικειμένου.