2014-10-26 28 views
22

我定义了一个简单的类:如何满足包含初始化程序的协议?

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 
    } 
} 

我收到以下错误:

Initializer requirement 'init(name:)' can only be satisfied by a required initializer in the definition of non-final class 'MyClass'

什么在这里?

(顺便说一句:我不能让我的final类,因为这仅仅是一个更复杂的用例的提取物)

+1

这可能是目前的问题:https://devforums.apple.com/message/1057171#1057171 – Klaas 2014-10-26 22:29:44

回答

16

好吧,是我不好。

为了保证所有的子类符合MyProtocol,新的初始化器也必须标记为required

此外,Swift需要直接在类中声明所有必需的初始化方法,并且不允许在扩展中声明它们。

+2

我同意:只要我复制粘贴我的扩展到类本身,一切工作。 – user2013 2015-07-10 22:58:05

+2

我不明白。你会在修复后显示你的代码吗? – 2017-03-19 21:09:21

+0

我跟着这个答案,并得到'所需的便利'初始值设定项。哇。 – kelin 2018-01-29 17:17:35