ios - 如何在用户默认中保存对象列表?

标签 ios arrays swift list nsuserdefaults

我的目标是:

 struct Order: Codable {
        var item_id:String = ""
        var quantity:Int = 0
        var image:String = ""
        var name:String = ""
        var desc:String = ""
    }

函数的类是:

    class func saveOrder(value: [Order]) {
        print(value)
        let placesData = NSKeyedArchiver.archivedData(withRootObject: value)
        UserDefaults.standard.set(placesData, forKey: "orderHistoryArray")
    }

    class func getOrder() -> [Order] {
        if let order = UserDefaults.standard.array(forKey: "orderHistoryArray") {
            return order as! [Order]
        }
        return []
    }

当我尝试使用此功能时:

            SavedData.saveOrder(value: itemsInCart)

这对我不起作用,有什么帮助吗?!!!

最佳答案

您混淆了协议(protocol) CodableNSCoding

1) NSCoding

NSKeyed(Un)Archiver 属于 NSCoding。要使用它,您必须将 Order 声明为继承自 NSObjectclass 并采用协议(protocol)及其所需方法

class Order: NSObject, NSCoding {
    var item_id : String // no need to assign default values
    var quantity : Int
    var image : String
    var name : String
    var desc : String

    required init(coder decoder: NSCoder) 
    {
        item_id = decoder.decodeObject(forKey: "item_id") as! String
        quantity = decoder.decodeInteger(forKey: "quantity")
        image = decoder.decodeObject(forKey: "image") as! String
        name = decoder.decodeObject(forKey: "name") as! String
        desc = decoder.decodeObject(forKey: "desc") as! String
    }

    func encode(with coder: NSCoder) 
    { 
        coder.encode(item_id, forKey: "item_id")
        coder.encode(quantity, forKey: "quantity")
        coder.encode(image, forKey: "image")
        coder.encode(name, forKey: "name")
        coder.encode(desc, forKey: "desc")
    }
}

然后您可以加载并保存数据

class func saveOrder(value: [Order]) {
    print(value)
    let placesData = NSKeyedArchiver.archivedData(withRootObject: value)
    UserDefaults.standard.set(placesData, forKey: "orderHistoryArray")
}

class func getOrder() -> [Order] {
    guard let orderData = UserDefaults.standard.data(forKey: "orderHistoryArray"),
          let order = NSKeyedUnarchiver.unarchiveObject(with: orderData) as? [Order] else { return [] }
    return order
}

2) 可编码

使用Codable,您可以保留您的结构。只需采用协议(protocol)并将编码器创建的Data保存到磁盘

struct Order : Codable {
    var item_id : String
    var quantity : Int
    var image : String
    var name : String
    var desc : String
}

// Both methods `throw` to hand over an en-/decoding error to the caller
class func saveOrder(value: [Order]) throws {
    print(value)
    let placesData = try JSONEncoder().encode(value) else { return }
    UserDefaults.standard.set(placesData, forKey: "orderHistoryArray")
}

class func getOrder() throws -> [Order] {
    guard let orderData = UserDefaults.standard.data(forKey: "orderHistoryArray") else { return [] }
    return try JSONDecoder().decode([Order].self, from: orderData)
}

关于ios - 如何在用户默认中保存对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51812407/

相关文章:

python - Numpy:如何将 (4, ) 数组和 (9, 9) 数组添加到 (9, 9, 4) 数组?

ios - PresentViewController 不工作

javascript - 如何按字母顺序对嵌套数组进行排序而不影响外部对象数组的顺序?

json - 如何在 Swift 中解码 HTML 实体?

swift - 如何删除 Swift 3 中的特殊字符

iphone - 如何重新加载 UIVIew 的 UIViewController 数据

ios - 如何在 SceneKit 中加载多个对象?

ios - 点击 UIControl 时结束 UITextView 编辑

iphone - 以编程方式确定 VoiceOver 读取 UIView 项目的顺序

jQuery 从属性值检索数组