Каков вариант использования для удобства инициализации?

В 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) }

Другие вопросы по тегам