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

The required encoding function doesn't shown in a working code

序列化反序列化是通过NSCoding协议中定义的两种方法完成的,如下

encodeWithCoder(_ aCoder: NSCoder) {
    // Serialize your object here
}

init(coder aDecoder: NSCoder) {
    // Deserialize your object here
}

在我自己的 ViewController(继承自 UITableViewController)中,我有一个数组,其中包含我自己的名为 Item 的对象,并且我实现了 init(coder aDecoder: NSCoder) 初始函数. Item 定义如下

class Item: NSObject, NSCoding {
    var text = ""
    var checked = false

    func toggleChecked() {
            checked = !checked
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.text, forKey: "SLAText")
        aCoder.encode(self.checked, forKey: "SLAChecked")
    }

    required init?(coder aDecoder: NSCoder) {
        self.text = aDecoder.decodeObject(forKey: "SLAText") as! String
        self.checked = aDecoder.decodeBool(forKey: "SLAChecked")
        super.init()
    }

    override init() {
        super.init()
    }
}

而是实现函数 encode(with: NSCoder) 我定义了自己的序列化函数 saveItems()

 func saveItems() {
        let data = NSMutableData()
        let archiver = NSKeyedArchiver(forWritingWith: data)

        archiver.encode(items, forKey: "ItemLists") //items is a array of type [Item]
        archiver.finishEncoding()

        data.write(to: dataFilePath(), atomically: true)      
    }

问题

为什么代码没有实现所需的 NSCoding 功能?该代码是从我正在学习的书的示例中简化而来的,我根本没有找到 encodeWithCoder(_ aCoder: NSCoder) 函数。 required means 你不是必须实施它吗?

感谢您的宝贵时间和帮助

Why the code is working with out implement the required NSCoding function?

这不是真的。

NSCoding 是一个协议

首先NSCoding是协议,不是函数。为了使类型符合 NSCoding 你需要实现一个方法和一个初始化器

public func encode(with aCoder: NSCoder)
public init?(coder aDecoder: NSCoder)

为什么你的代码有效?

让我们看看你在做什么

archiver.encode(items, forKey: "ItemLists")

这里items定义为[Item],即Item(s)的数组。 而Array确实符合NSCoding。这可以通过编写

轻松测试
let nums = [1, 2, 3]

if nums is NSCoding {
    print("Array does conform to NSCoding")
} else {
    print("Array does NOT conform to NSCoding")
}

结果是

Array does conform to NSCoding

结论

当然要正常工作,数组内部的元素也必须符合 NSCodable。由于您的数组的通用类型是 Item(您使其符合 NSCodable),该机制 确实 正常工作。