Вот простой протокол:Swift протокол определяет инициализации, который не работает на UIViewController
protocol StringsInitiable {
init(strings: [String])
}
Попытка использовать инициализатор в расширении работает, когда ограничение на NSObject ...
extension StringsInitiable where Self: NSObject {
func test() {
let _ = Self(strings: [])
}
}
... но не когда ограничение на UIViewController. Затем он жалуется, что инициализатор должен быть помечен как «кодер», ссылаясь на обязательный инициализатор из NSCoding.
extension StringsInitiable where Self: UIViewController {
func test() {
let _ = Self(strings: []) // error label 'strings:' expected 'coder:'
}
}
Есть ли способ использовать инициализатор объявленную в протоколе, даже если будучи подкласс UIViewController?
EDIT
Это, кажется, работает, когда сдерживающие расширение до базового класса (NSObject или любого Swift класса, который не наследует от чего-либо), но не тогда, когда сдерживающие расширение для дочернего класса.
Что именно вы tryign достичь, так или иначе? Это не имеет смысла. Вы расширяете 'StringsViewController' ... это не подкласс' UIViewController'? – Alexander
не против примера, если вы попробуете с расширением StringsViewController, где Self: NSObject', вместо этого он работает. В этом случае с UIViewController (и, я думаю, с NSCoding) что-то не так. И это не однотипное требование;) – greg3z