2017-01-22 46 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失效。