【问题标题】:Correctly init NSCoder in sub class when init NSCoder is convenience method in base class in Swift当 init NSCoder 是 Swift 基类中的便捷方法时,正确地在子类中初始化 NSCoder
【发布时间】:2023-04-04 11:46:01
【问题描述】:

这是我的代码:

import Foundation


class Person: NSObject, NSCoding {

var name: String



init(name: String) {
    self.name = name
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(name, forKey: "name")
}

required convenience init?(coder aDecoder: NSCoder) {

    let name = aDecoder.decodeObjectForKey("name") as! String

    self.init(name: name)

}  
}


class Martin: Person {

 init() {
    self.init(name: "Martin")
}

required convenience init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

}

let p = Martin()

print(p.name)

由于某种原因,我总是会遇到 catch-22 的情况,我认为使这项工作正常进行的唯一方法是显式初始化 required convenience init?(coder aDecoder: NSCoder) 中的所有属性以消除便利性并在 @987654324 中执行 super.init(coder: aDecoder) @

我阅读了 Swift 中的 init 规则,仍然不明白为什么 Martin 在这种情况下不能从 Person 继承便利 init。

【问题讨论】:

    标签: swift nscoder


    【解决方案1】:

    因为the rules 声明

    1. 指定初始化程序必须从其直接超类调用指定初始化程序。
    2. 便利构造器必须调用同一个类的另一个构造器。
    3. 便利构造器最终必须调用指定构造器。

    【讨论】:

    • 那么如果不使init?(coder aDecoder: NSCoder)成为不方便的方法,就没有办法让它工作吗?我认为使用规则 2 我可以让它以某种方式工作。规则 2If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.
    • 一如既往,解决方案非常简单:class Martin: Person { convenience init() { self.init(name: "Martin") } } 这样 Martin 继承了所有父级的初始化器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多