Swift 绕过自动初始值设定项继承规则

Swift 绕过自动初始值设定项继承规则,swift,inheritance,initialization,Swift,Inheritance,Initialization,我有一组类,它们都继承自一个超类。这个超类提供了一个足够通用的初始值设定项,可以适用于所有子类。具体而言,它包括: init(values: [String: Any]) { updateValues(dict: values) } 及 通过重写子类中的updateValues(),并利用动态分派确保每个子类正确设置自己的变量,一切似乎都正常工作 例如,在用户类中,属性声明如下: var name: String? var uid: String? var email: String?

我有一组类,它们都继承自一个超类。这个超类提供了一个足够通用的初始值设定项,可以适用于所有子类。具体而言,它包括:

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

通过重写子类中的
updateValues()
,并利用动态分派确保每个子类正确设置自己的变量,一切似乎都正常工作

例如,在用户类中,属性声明如下:

var name: String?
var uid: String?
var email: String?
var username: String?
它的
updateValue()
如下所示:

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?){...
然而,这个初始值设定项声明产生了一个不期望的结果。根据第页的Swift“自动初始值设定项继承”规则,一旦为子类提供了一个指定的初始值设定项,它就不再继承超类的初始值设定项。这使得继承非常乏味,因为我现在必须重写我想要自动继承的初始值设定项,只需为每个子类调用
super.init()
。我还必须重写此
override init
--
super.init()
解决方案的每个实例的注释

是否仍然要继承超类指定的初始值设定项?还是我想的不对

注意:我注释掉了子类和超类的指定初始值设定项是自动继承的。通过添加额外的子类初始值设定项(或取消对它们的注释),功能上确实没有变化,因此我想找到一种解决安全检查Swift强制执行的方法

您应该(而且必须)始终调用指定的初始值设定项。这就是指定初始值设定项的含义。如果指定的初始值设定项是
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])
}
这不应该使您的其他初始化无效

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