我在下面有两个模型swift文件。

// Item.swift

import UIKit

class Item: NSObject, NSCoding {
    var name: String
    var valueInDollars: Int
    var serialNumber: String?
    let dateCreated: Date
    let itemKey: String

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(dateCreated, forKey: "dateCreated")
        aCoder.encode(itemKey, forKey: "itemKey")
        aCoder.encode(serialNumber, forKey: "serialNumber")

        aCoder.encode(valueInDollars, forKey: "valueInDollars")
    }

    required init(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "name") as! String
        dateCreated = aDecoder.decodeObject(forKey: "dateCreated") as! Date
        itemKey = aDecoder.decodeObject(forKey: "itemKey") as! String
        serialNumber = aDecoder.decodeObject(forKey: "serialNumber") as! String?

        valueInDollars = aDecoder.decodeInteger(forKey: "valueInDollars")

        super.init()
    }
}


// ItemStore.swift

import UIKit

class ItemStore {

    var allItems = [Item]()
    let itemArchiveURL: URL = {
        let documentsDirectories =
            FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentDirectory = documentsDirectories.first!
        return documentDirectory.appendingPathComponent("items.archive")
    }()

    func saveChanges() -> Bool {
        print("Saving items to: \(itemArchiveURL.path)")
        return NSKeyedArchiver.archiveRootObject(allItems, toFile: itemArchiveURL.path)
    }
}


这两个模型文件确认使用NSCoding协议,并使用archiveRootObject归档数据。

但是archiveRootObject已过时,并且NSCoding不如NSSecureCoding安全,如何调整代码以调整所有这些?

最佳答案

您可以将saveChanges函数重写为如下形式:

    func saveChanges() -> Bool {
        print("Saving items to: \(itemArchiveURL.path)")
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: allItems, requiringSecureCoding: false)
            try data.write(to: itemArchiveURL)
        }
        catch {
            print("Error archiving data: \(error)")
            return false
        }
        return true
    }

关于ios - 从archiveRootObject迁移到archivedData,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58196928/

10-10 17:15