2014-10-26 27 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