Каква е разликата между 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")
Ключовата разлика е в ролята им в веригата за инициализация и правилата за делегиране: определен инициализатор гарантира пълната инициализация на своите свойства и делегира инициализация към родителския клас, докато удобният инициализатор улеснява създаването на екземпляри, делегирайки към друг инициализатор в същия клас, който в крайна сметка извиква определен инициализатор.