Ποια είναι η διαφορά μεταξύ των αρχικοποιητών convention και designated στη Swift;
sobes.tech AI
Απάντηση από AI
-
Ορισμένος Αρχικοποιητής: Ο κύριος, "βασικός" αρχικοποιητής στην κλάση. Πρέπει να αρχικοποιεί πλήρως όλες τις ιδιότητες αποθήκευσης της κλάσης και στη συνέχεια να καλεί τον ορισμένο αρχικοποιητή της υπερκλάσης (μέσω
super.init). Κάθε κλάση πρέπει να έχει τουλάχιστον έναν ορισμένο αρχικοποιητή. -
Αρχικοποιητής Ευκολίας: Ένας βοηθητικός αρχικοποιητής που προορίζεται να απλοποιήσει τη δημιουργία στιγμιότυπων της κλάσης σε ορισμένα σενάρια. Πρέπει να καλεί έναν άλλο αρχικοποιητή της ίδιας κλάσης — είτε ορισμένο είτε ευκολίας. Τελικά, η αλυσίδα κλήσεων των αρχικοποιητών ευκολίας πρέπει να οδηγήσει στην κλήση του ορισμένου αρχικοποιητή στην ίδια κλάση. Οι αρχικοποιητές ευκολίας είναι προαιρετικοί.
Ακολουθεί το σχήμα ανάθεσης αρχικοποίησης:
Convenience -> Ορισμένος (στην ίδια κλάση)
Ορισμένος -> Ορισμένος (στην γονική κλάση)
Παράδειγμα:
class MyClass {
var value: Int
var name: String
// Ορισμένος αρχικοποιητής
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Αρχικοποιητής ευκολίας
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Καλεί τον ορισμένο αρχικοποιητή στην ίδια κλάση
}
// Άλλος αρχικοποιητής ευκολίας
convenience init(name: String) {
self.init(value: 0, name: name) // Καλεί τον ορισμένο αρχικοποιητή στην ίδια κλάση
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
Το βασικό διαφορά βρίσκεται στον ρόλο τους στην αλυσίδα αρχικοποίησης και στους κανόνες ανάθεσης: ο ορισμένος αρχικοποιητής εγγυάται την πλήρη αρχικοποίηση των ιδιοτήτων του και αναθέτει την αρχικοποίηση στην γονική κλάση, ενώ ο αρχικοποιητής ευκολίας απλοποιεί τη δημιουργία στιγμιότυπων αναθέτοντας σε έναν άλλο αρχικοποιητή στην ίδια κλάση, ο οποίος τελικά καλεί τον ορισμένο αρχικοποιητή.