保存和加载结构数组的最佳实践是什么?

时间:2019-06-06 10:06:41

标签: arrays swift struct save

我正在寻找保存结构数组的建议,因此它们一开始就可用,可以轻松访问和更新。

我看过的所有教程都只有一个struct实例,因此我在实现结构数组方面一直失败。

数据结构为:

    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]()

2 个答案:

答案 0 :(得分:1)

由于您的struct Stock符合Codable,因此您可以使用array [Stock]UserDefaults作为data存储在JSONEncoder中,即,

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

类似地,您可以像这样使用UserDefaultsJSONDecoder进行获取,

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等。

答案 1 :(得分:0)

我认为, 您可以将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")