gpt4 book ai didi

swift - 当 init NSCoder 是 Swift 中基类中的便捷方法时,正确地在子类中初始化 NSCoder

转载 作者:搜寻专家 更新时间:2023-11-01 05:37:15 26 4
gpt4 key购买 nike

这是我的代码:

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)

出于某种原因,我总是以第 22 条军规告终,我认为使这项工作有效的唯一方法是显式初始化 required convenience init?(coder aDecoder: NSCoder) 中的所有属性能够消除便利并在 Martin

中执行 super.init(coder: aDecoder)

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

最佳答案

因为 the rules声明

  1. A designated initializer must call a designated initializer from its immediate superclass.
  2. A convenience initializer must call another initializer from the same class.
  3. A convenience initializer must ultimately call a designated initializer.

关于swift - 当 init NSCoder 是 Swift 中基类中的便捷方法时,正确地在子类中初始化 NSCoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35501168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com