首页 文章

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

提问于
浏览
1

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

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 "Automatic Initializer Inheritance"规则,一旦为子类提供了一个指定的初始值设定项,它就不再继承超类的初始值设定项 . 这使得继承相当繁琐,因为我现在必须覆盖我想要自动继承的初始化器,并且只需为每个子类调用 super.init() . 我还必须为此 override init - super.init() 解决方法的每个实例重写注释 .

反正还有继承超类指定初始值设定项吗?或者我错误地想到了这个?

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

1 回答

  • 1

    您应该(并且必须)始终呼叫指定的初始化程序 . 这就是指定初始化程序的含义 . 如果您指定的初始化程序是 init(value:) ,那么 init(name: String?, uid: String?, email: String?, username: String?) 应该是一个调用它的便捷初始化程序 . 实现一个新的"must-call"(即指定的初始化程序)意味着超类's designated initializer is invalid for this subclass, but that'不是这里的情况 . 所以写一下:

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

    这不应该使您的其他内容无效 .

相关问题