Как удовлетворить протокол, который включает инициализатор?
Я определил простой класс:
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
, потому что это только экстракт более сложного варианта использования.)
Ответы
Ответ 1
Хорошо, мой плохой.
Чтобы гарантировать соответствие всех подклассов MyProtocol
, новый инициализатор должен быть помечен как required
.
Кроме того, Swift требует объявления всех необходимых инициализаторов непосредственно внутри класса и не позволяет объявлять их в расширениях.