【发布时间】:2017-01-22 23:25:59
【问题描述】:
我有一组类都继承自一个超类。这个超类提供了一个足够通用的初始化器以适用于所有子类。具体包含:
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() 解决方法的每个实例重写 cmets。
是否仍然继承超类指定的初始值设定项?还是我想错了?
注意:我注释掉了子类的指定初始化器,超类初始化器是自动继承的。通过添加额外的子类初始化程序(或取消注释它们)确实没有改变功能,所以我想找到一种方法来解决 Swift 强制执行的安全检查。
【问题讨论】:
标签: swift inheritance initialization