Подтвердить что ты не робот

Как удовлетворить протокол, который включает инициализатор?

Я определил простой класс:

class MyClass {
    var name:String?

    required init() {
        println("init")
    }
}

Я могу добавить новый инициализатор в расширение, подобное этому:

extension MyClass {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

Все работает нормально.

Но, как только я определяю новый инициализатор в протоколе:

protocol MyProtocol {
    init(name:String)
}

И заставьте мое расширение подтвердить этот протокол:

extension MyClass : MyProtocol {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

Я получаю следующую ошибку:

Требование инициализатора 'init (name:)' может удовлетворяться только required инициализатор в определении не конечного класса MyClass

Что здесь происходит?

(BTW: Я не могу сделать свой класс final, потому что это только экстракт более сложного варианта использования.)

4b9b3361

Ответ 1

Хорошо, мой плохой.

Чтобы гарантировать соответствие всех подклассов MyProtocol, новый инициализатор должен быть помечен как required.

Кроме того, Swift требует объявления всех необходимых инициализаторов непосредственно внутри класса и не позволяет объявлять их в расширениях.