arrays - 如何在 Codable (Swift) 中保存多个数据

标签 arrays swift data-structures codable

我将 Codable 协议(protocol)与 JSONEncoder 和 JSONDecoder 一起使用。

但是我保存数据的时候,只保存了最后一个值,但是我需要保存不止一个。

如果我添加三张卡片,我只能看到最后一张。

例子:

我加卡:

        CName: Test1, BarCode: 12345, CardNBR: 12345

        CName: Test2, BarCode: 1234567, CardNBR: 1234567

        CName: Test3, BarCode: 123456789, CardNBR: 123456789

最后只看到:CName: Test3, BarCode: 123456789, CardNBR: 123456789

如何保存多个数据?

struct Entity : Codable  {

   var cname: String
   var barcode: String
   var cardnbr: String
}

保存

let arr = Entity(cname: CompanyName, barcode: BarCodeField, cardnbr: CardNumber)

do {
   let data  = try JSONEncoder().encode(all)
   UserDefaults.standard.set(data, forKey: "Key")
} catch {
   print(error)
}

加载

do {
   let content = UserDefaults.standard.data(forKey: "Key")
   let saved = try JSONDecoder().decode([Entity].self, from: content!)
   print(saved)
} catch {
   print(error)
}

let arr = Entity(cname: CompanyName, barcode: BarCodeField, cardnbr: CardNumber)

        let jsonEncoder = JSONEncoder()
        do {
            var jsonData = try jsonEncoder.encode(arr)
            let jsonString = String(data: jsonData, encoding: .utf8)
            print("JSON String : " + jsonString!)

            let jsonDecoder = JSONDecoder()
            let upMovie = try jsonDecoder.decode(Entity.self, from: jsonData)
            print("upMovie : \(upMovie)")
            print("cname : \(arr.cname)")
            print("barcode : \(arr.barcode)")
            print("cardnbr : \(arr.cardnbr)")
            entities.append(Entity(cname: arr.cname, barcode: arr.barcode, cardnbr: arr.cardnbr))
            print(entities)
        }
        catch {
        }

最佳答案

每次你保存新的

let arr = Entity(cname: CompanyName, barcode: BarCodeField, cardnbr: CardNumber)

只包含一个实体,这就是你只得到最后一个实体的原因

解决方案:在保存之前,您还必须添加最后保存的数组。
假设一个实体

let aEntity = Entity(CName: "Test1", BarCode: "12345", CardNBR: "12345")

并保存

if var all :[Entity] = loadData() {
    all.append(aEntity)
    saveData(allData: all)
}else {
    saveData(allData: [aEntity])
}

在类中添加如下函数

func saveData(allData:[Entity]) {
    do {
        let data  = try JSONEncoder().encode(allData)
        UserDefaults.standard.set(data, forKey: "Key")
    } catch {
        print(error)
    }
}
func loadData() -> [Entity]?{
    do {
        if let content = UserDefaults.standard.data(forKey: "Key") {
            let saved :[Entity] = try JSONDecoder().decode([Entity].self, from: content)
            print(saved)
            return saved
        }
    } catch {
        print(error)
    }
    return nil
}

关于arrays - 如何在 Codable (Swift) 中保存多个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51096104/

相关文章:

ios - 如何将对象设置为 plist 文件中的嵌套字典或数组

Javascript 数学函数和数组

ios - 使用 UIEdgedInset 的自定义 UISlider 渲染效果不佳

c - BST 和链表 C 程序陷入大值

c++ - 作为结构内部字段的映射的初始化值?

c - GCC错误;下标值既不是数组也不是指针也不是 vector

arrays - 如何从一个可观察对象数组创建一个数组的可观察对象?

JavaScript:根据条件创建二维对象数组

ios - 通过按下按钮(Swift)打开具有特定位置的天气应用程序

ios - Swift 按钮框架高度问题 (viewDidLayoutSubviews)