gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:08:33 25 4
gpt4 key购买 nike

我的目标是:

 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) NS编码

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com