我有一组类都从一个超类继承。这个超类提供了一个通用的初始化方法,足以适用于所有的子类。具体来说它包含:解决自动初始化器继承规则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强制执行的安全检查的方法。