16

我想扩展一个框架类(我不想直接编辑源代码),并使其符合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这不是很奇怪吗?不应该是一个convenience initializer吗?)。但是,文档说扩展不能添加新的指定初始化程序。

我的英语不是很完美,也许我错过了什么……或者真的不可能吗?

4

1 回答 1

13

就像文档说的那样,扩展不能添加新的指定初始化器。如果有需要初始化的私有属性怎么办?无法正确初始化类型。您可以在扩展中添加便利初始化程序,因为从本质上讲,它们必须调用指定的初始化程序。

此外, init(coder aDecoder: NSCoder) 被指定为指定的初始化程序,因为它是创建实例的完全不同的途径。以 UIViewController 为例,它可以使用纯代码创建,也可以从 XIB 文件创建。

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

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

于 2014-11-09T04:06:55.770 回答