Каков вариант использования для удобства инициализации?
В swift есть концепция обозначенного инициализатора (я полагаю, что это "нормальный" конструктор, который мы знаем из других языков).
Но есть также кое-что под названием Convenience Initializer, которое я понимаю, как писать, но смысл для меня потерян.
Как, если я правильно понимаю, вы можете добиться того же, не написав ключевое слово convenience
, или нет?
2 ответа
На самом деле их очень легко понять: они являются инициализаторами с параметрами по умолчанию.
Из документов:
Удобные инициализаторы являются вторичными, поддерживающими инициализаторы для класса. Вы можете определить удобный инициализатор для вызова назначенного инициализатора из того же класса, что и удобный инициализатор, с некоторыми параметрами назначенного инициализатора, установленными в значения по умолчанию. Вы также можете определить удобный инициализатор для создания экземпляра этого класса для конкретного варианта использования или типа входного значения.
Пример:
class A {
var a: Int
var b : Int
init() {
a = 0
b = 0
}
/*convenience*/ init(a: Int) {
self.init()
self.a = a
}
}
В приведенном выше случае вы не можете позвонить self.init()
, вы должны пометить ваш инициализатор с convenience
ключевое слово, иначе это будет ошибка компилятора. Таким образом, вы не можете связать два назначенных инициализатора из одного класса.
Как я понимаю, единственная точка в этих инициализаторах - удобство. Иногда бывает так, что нам часто приходится создавать какой-то объект с одними и теми же аргументами снова и снова. В этом случае мы можем просто добавить другой метод init, который принимает гораздо меньше параметров, а остальные жестко закодированы.
Например, какой-то класс Logger
init(type: LoggerType, filepath: String, configurations: LoggerConfig, etc.)
Возможно, мы часто используем этот логгер с одинаковыми аргументами. Чтобы избежать дублирования кода, мы можем добавить удобный инициализатор с некоторыми значениями по умолчанию
convenience init(){
self.init(type: LoggerType.SomeType, filepath: "/log", configurations: LoggerConfig.Default)
}