swift - 添加 NSCoding 作为扩展

标签 swift nscoding designated-initializer

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

相关文章:

swift - 为什么修饰符 .navigationBarTitle 没有应用到 NavigationView?

swift - 所需的编码功能未在工作代码中显示

ios - NSKeyedArchiver 不保存自定义对象属性

ios - loadNibNamed 与 initWithFrame 两难设置框架的高度和宽度

ios - 在 Swift 中动态计算速度

javascript - didSet 在 Javascript : calling function when variable is altered

swift - 无法使用 Spritekit Swift 创建一个将您转换到主菜单的按钮

arrays - 检索数组功能不起作用

ios - 为什么我必须为我的编程 UIViewController 子类声明相同的必需但未实现的初始化程序(编码器 aDecoder)?

c - gcc 编译器报告警告,但 a.out 工作顺利,否则