我正在寻找保存结构数组的建议,因此它们一开始就可用,可以轻松访问和更新。
我看过的所有教程都只有一个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]()
答案 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)
}
类似地,您可以像这样使用UserDefaults
从JSONDecoder
进行获取,
if let data = UserDefaults.standard.data(forKey: "stocksArray") {
do {
let arr = try JSONDecoder().decode([Stock].self, from: data)
print(arr)
} catch {
print(error)
}
}
这是存储array
的一种方法。还有其他方法-CoreData
,File
等。
答案 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")