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

时间:2017-06-27 22:17:04

标签: swift cocoa archive nscoding

序列化反序列化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)函数。是否必须实施它?

感谢您的时间和帮助

1 个答案:

答案 0 :(得分:1)

  

为什么代码无法实现所需的NSCoding功能?

事实并非如此。

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),因此 机制正常工作。