Kla*_*aas 29 initialization initializer swift
我定义了一个简单的类:
class MyClass {
var name:String?
required init() {
println("init")
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在这样的扩展中添加一个新的初始化程序:
extension MyClass {
convenience init(name: String) {
self.init()
self.name = name
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常.
但是只要我在协议中定义新的初始化程序:
protocol MyProtocol {
init(name:String)
}
Run Code Online (Sandbox Code Playgroud)
并让我的扩展确认该协议:
extension MyClass : MyProtocol {
convenience init(name: String) {
self.init()
self.name = name
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
初始化程序要求'init(name :)'只能通过
required
非final类'MyClass'定义中的初始化程序来满足
这里发生了什么?
(顺便说一句:我不能上课final
,因为这只是一个更复杂的用例的摘录.)
Kla*_*aas 24
好的,我的坏.
为了保证所有符合MyProtocol
新初始化程序的子类都必须标记为required
.
此外,Swift要求在类中直接声明所有必需的初始值设定项,并且不允许在扩展中声明它们.
extension MyClass : MyProtocol {
required convenience init(name: String) {
self.init()
self.name = name
}
}
Run Code Online (Sandbox Code Playgroud)