添加NSCoding作为扩展

DCM*_*xxx 16 nscoding designated-initializer swift

我想扩展一个框架类(我不想直接编辑源代码),并使其符合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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是init(coder aDecoder: NSCoder),根据头文件,a designated initializer(这不是很奇怪吗?不应该是convenience initializer).但是,文档说扩展无法添加新的指定初始化程序.

我的英语不完美,也许我错过了一些东西......或者它真的不可能?

dre*_*wag 13

与文档说的一样,扩展无法添加新的指定初始化程序.如果有私有属性需要初始化怎么办?正确初始化类型是不可能的.您可以在扩展中添加便利初始值设定项,因为它们的性质必须调用指定的初始值设定项.

此外,init(coder aDecoder:NSCoder)被指定为指定的初始值设定项,因为它是创建实例的完全不同的路径.以UIViewController为例,它可以使用普通代码创建,也可以从XIB文件创建.

最后,无法添加实现NSCoding的扩展.

也许您可以创建一个包含此类的包装类,并让它实现NSCoding.