2017-01-22 43 views
1

我有一組類都從一個超類繼承。這個超類提供了一個通用的初始化方法,足以適用於所有的子類。具體來說它包含:解決自動初始化器繼承規則Swift

init(values: [String: Any]) { 
    updateValues(dict: values) 
} 

func updateValues(dict: [String: Any]){ 
    //To be implemented in subclasses 
} 

通過重寫子類updateValues(),並利用動態分配,以確保每個子類中正確設置它自己的變量,一切似乎工作。

例如,在用戶類,屬性聲明如下所示:

var name: String? 
var uid: String? 
var email: String? 
var username: String? 

及其updateValues()樣子:

override func updateValues(dict: [String: Any]) { 
    self.name = dict["name"] as? String 
    self.uid = dict["uid"] as? String 
    self.email = dict["email"] as? String 
    self.username = dict["username"] as? String 
} 

這完美的作品。但是,在需要手動設置變量的情況下,而不是從字典中,我需要爲子類添加自定義指定初始化程序。例如,對於上述用戶類一個這樣的初始值設定爲:

init(name: String?, uid: String?, email: String?, username: String?){... 

然而,這種初始化聲明產生不希望的結果。根據this頁面上的Swift「自動初始化程序繼承」規則,一旦將一個指定的初始化程序提供給子類,它就不再繼承超類的初始化程序。這使得繼承非常繁瑣,因爲我現在必須重寫我想自動繼承的初始化程序,並且簡單地爲每個子類調用super.init()。我還必須重寫針對override init - super.init()解決方法的每個實例的評論。

是否仍然繼承超類指定的初始值設定項?或者我錯誤地考慮了這個問題?

注意:我註釋了子類的指定初始值設定項和超類初始值設定項是自動繼承的。通過添加額外的子類初始值設定項(或取消註釋),功能上沒有任何變化,所以我想找一種解決Swift強制執行的安全檢查的方法。

回答

1

您應該(並且必須)始終調用指定的初始化程序。這就是指定初始化器的意思。如果您指定的初始化程序是init(value:),那麼init(name: String?, uid: String?, email: String?, username: String?)應該是一個方便的初始化程序,它可以調用它。實現一個新的「必須調用」(即指定的初始化器)意味着超類的指定初始化器對於這個子類是無效的,但這不是這種情況。所以只要寫:

convenience init(name: String?, uid: String?, email: String?, username: String?) { 
    self.init(values: ["name": name, "uid": uid, "email": email, "username": username]) 
} 

這不應該使您的其他inits失效。