Каковы удобные инициализаторы в Swift?

Я видел в этом ответе, что пользователь указывает convenience required init(). Что именно это означает?

Я понимаю, что ключевое слово required используется для переопределения инициализатора, указанного в суперклассе, но что делает декларация convenience required?

Ответ 1

Инициализатор, необходимый для удобства, является инициализатором, который применяется ко всем подклассам, но не является назначенным инициализатором. Это означает, что указанный инициализатор в конечном итоге вызовет назначенный инициализатор в своей цепочке инициализации.

Назначенные инициализаторы

Назначенный инициализатор - это канонический инициализатор для класса и тот, который должен быть вызван всеми необходимыми и удобными инициализаторами. Документы говорят:

Обозначенные инициализаторы являются первичными инициализаторами для класса. назначенный инициализатор полностью инициализирует все свойства, введенные этот класс и вызывает соответствующий инициализатор суперкласса для продолжения процесс инициализации цепи суперкласса.

Инициализаторы удобства

Инициализатор удобства - это инициализатор, который устанавливает определенную информацию о конфигурации в классе... удобно. Документация:

Инициализаторы удобства являются вторичными, поддерживая инициализаторы для класс. Вы можете определить инициализатор удобства для вызова назначенного инициализатор из того же класса, что и инициализатор удобства с некоторые из заданных параметров инициализаторов установлены на значения по умолчанию. Вы также можете определить инициализатор удобства для создания экземпляра этот класс для конкретного варианта использования или типа входного значения.

Вам не нужно предоставлять инициализаторы удобства, если ваш класс делает не требуют их. Создавайте инициализаторы удобства, когда ярлык к общей схеме инициализации сэкономит время или сделает инициализация класса clearer в намерении

Необходимые инициализаторы

Необходимые инициализаторы можно рассматривать как договор привязки между интерфейсом родителей и последующими подклассами. Его средства обеспечения того, чтобы все ваши дети знали и реализовывали определенный набор инициализаторов.

Запишите необходимый модификатор перед определением класса инициализатор, чтобы указать, что каждый подкласс класса должен реализовать этот инициализатор:

Ответ 2

Инициализатор класса может быть помечен required, чтобы указать, что каждый подкласс класса должен реализовать этот инициализатор.

В качестве подкласса вы можете использовать назначенный инициализатор или инициализатор удобства для удовлетворения этого требования.

Ответ 3

Объявление требуемого инициализатора класса как удобства позволяет подклассам легко наследовать его и тем самым опустить его реализацию

protocol P {
    var some: Int! {get}
    init(some: Int)
}

class C: P {
    private(set) var some: Int!
    convenience required init(some: Int) {
        self.init()
        self.some = some
    }
}

class D: C {
    // no need in required init(some: Int)...
}