我想扩展一个框架类(我不想直接编辑源代码),并使其符合NSCoding
。
基本上,这是我所处情况的简化:
/* Can't be edited. */
class Car: NSObject {
var color: String?
}
/* Can be edited */
extension Car: NSCoding {
init(coder aDecoder: NSCoder) {
}
func encodeWithCoder(aCoder: NSCoder) {
}
}
根据头文件,问题是 init(coder aDecoder: NSCoder)
是一个 designated initializer
(这不是很奇怪吗?应该它不是便利初始化器
吗?)。然而,documentation说扩展不能添加新的指定初始化程序。
我的英语不完美,也许我漏掉了一些东西......或者真的不可能吗?
最佳答案
如文档所述,扩展不能添加新的指定初始化器。如果有私有(private)属性需要初始化怎么办?正确初始化类型是不可能的。您可以在扩展中添加便利初始化程序,因为根据它们的性质,它们必须调用指定的初始化程序。
此外,init(coder aDecoder: NSCoder) 被指定为指定初始化器,因为它是创建实例的完全不同的路径。以 UIViewController 为例,它可以使用纯代码创建,也可以从 XIB 文件创建。
最终还是无法添加实现NSCoding的扩展。
也许您可以创建一个包含此类的包装类并让它实现 NSCoding。
关于swift - 添加 NSCoding 作为扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631727/