绕过自动初始化程序继承规则Swift

时间:2017-01-22 23:25:59

标签: swift inheritance initialization

我有一组所有继承自一个超类的类。这个超类提供了一个通用的初始化程序,足以适用于所有子类。具体来说它包含:

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?){...

然而,此初始化程序声明会产生不希望的结果。根据{{​​3}}页面上的Swift“自动初始化程序继承”规则,一旦为子类提供了一个指定的初始化程序,它就不再继承超类的初始化程序。这使得继承相当繁琐,因为我现在必须覆盖我想要自动继承的初始化器,并且只需为每个子类调用super.init()。我还必须为此override init - super.init()解决方法的每个实例重写注释。

无论如何仍然继承超类指定的初始值设定项?或者我错误地想到了这个?

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

1 个答案:

答案 0 :(得分:1)

您应该(并且必须)始终呼叫指定的初始化程序。这就是指定初始化程序的含义。如果您的指定初始值设定项为paths,那么<sdk>/extras/android/support/v7/appcompat 应该是一个调用它的便捷初始值设定项。实现一个新的“必须调用”(即指定的初始化程序)意味着超类的指定初始化程序对此子类无效,但这不是这种情况。所以写一下:

init(value:)

这不应该使你的其他内容无效。