【问题标题】:Whats the best practice to save and load array of struct?保存和加载结构数组的最佳做法是什么?
【发布时间】:2019-06-06 10:06:41
【问题描述】:

我正在寻找保存我的结构数组的建议,以便它们在开始时可用并且可以轻松访问和更新。

我看过的所有教程都只有 1 个结构实例,所以我在实现结构数组时一直失败。

数据结构是:

    struct Stock : Codable {
        let ticker : String
        let amount : Double
        var boughtAt : Double
        var totalValue : Double
        var realTimePrice : Double
        var float : Double
        var type : String
    }

    var stocksArray = [Stock]()

【问题讨论】:

  • 您应该解释使用案例以及您到目前为止所做的尝试,以便我们更好地回答您的问题
  • 使用核心数据 :)
  • 了解您要存储多少数据非常重要。另外,您一直在关注什么技术(例如,您尝试将数据存储在哪里)?
  • 首先UserDefaults不鼓励这种用户数据,您可以在文档文件夹、Core Data、Realm、Firebase、MYSQL 等其他数据库中使用编码数据作为 JSON 或属性列表文件. 或 CloudKit
  • 感谢@J.Doe 的想法 :) 我实际上是通过 CoreData 让它工作的。

标签: arrays swift struct save


【解决方案1】:

由于您的struct Stock 符合Codable,您可以使用JSONEncoder 轻松地将array [Stock] 存储为UserDefaults 中的data,即

var stocksArray = [Stock]()
do {
    let data = try JSONEncoder().encode(stocksArray)
    UserDefaults.standard.set(data, forKey: "stocksArray")
} catch  {
    print(error)
}

同样,您可以使用JSONDecoder 之类的方式从UserDefaults 获取,

if let data = UserDefaults.standard.data(forKey: "stocksArray") {
    do {
        let arr = try JSONDecoder().decode([Stock].self, from: data)
        print(arr)
    } catch {
        print(error)
    }
}

这是存储array 的一种方式。还有其他方法 - CoreDataFile 等。

【讨论】:

  • 这完美!对我来说非常简短易懂。最重要的是,一旦数据被加载,它的结构与我需要的完全相同,谢谢!
  • 二进制property lists 可能是UserDefaults 中更好的存储格式
【解决方案2】:

在我看来, 您可以将您的 Struct 转换为 Dictionary 类型并将该字典添加到 NSArray 并将该数组保存到手机的 Document 目录中。

例子,

struct Stock {
    var ticker : String = ""
    var amount : Double = 0.0
    var boughtAt : Double = 0.0
    var totalValue : Double = 0.0
    var realTimePrice : Double = 0.0
    var float : Double = 0.0
    var type : String = ""

    var json:Dictionary<String,Any> {
        set{
            self.ticker = newValue["ticker"] as! String
            self.amount = newValue["amount"] as! Double
            self.boughtAt = newValue["boughtAt"] as! Double
            self.totalValue = newValue["totalValue"] as! Double
            self.realTimePrice = newValue["realTimePrice"] as! Double
            self.float = newValue["float"] as! Double
            self.type = newValue["type"] as! String
        }
        get {
            return ["ticker":self.ticker,"amount":self.amount,"boughtAt":self.boughtAt,"totalValue":self.totalValue,"realTimePrice":self.realTimePrice,"float":self.float,"type":self.type]
        }
    }

    init(withJSON json:Dictionary<String,Any>) {
        self.json = json
    }
}
//Now, get dictionary from object and add it into array.
let stock = Stock(withJSON: [:])
let json = self.stock.json
let array = NSArray(arrayLiteral: json)

//Now, you can save NSArray to file.
array.write(toFile: "file path.plist", atomically: true)

//You can get array from plist file,
let array = NSArray(contentsOfFile: "file path.plist")

【讨论】:

  • 感谢您的这个想法 :) 但是,我会将该数据用于 UITable(我忘了提及),所以我必须在使用它之前重新创建我的结构。
猜你喜欢
  • 2017-04-21
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
相关资源
最近更新 更多