[英]How to store multiple back dates in a Swift Struct?
我想將前 4 天的關閉事件存儲在一個單獨的結構中,以便稍后在程序中引用它們。 從 JSON API 對它們進行排序后,您將如何存儲每 4 天的關閉事件。
下面的代碼已對前 4 天進行了排序,但我無法弄清楚如何存儲每一天以單獨使用它們
class DailyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo"
let urlObj = URL(string: jsonUrlString)
URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
guard let data = data else { return }
do {
let forex = try JSONDecoder().decode(Root.self, from: data)
let sortedKeys = forex.timeSeriesDaily.keys.sorted(by: >)
let requestedKeys = sortedKeys.prefix(4)
var requestedPrices = [String:Forex]()
requestedKeys.forEach{ requestedPrices[$0] = forex.timeSeriesDaily[$0] }
print(requestedPrices)
print()
} catch {
print(error)
}
}.resume()
}
struct Root: Codable {
let metaData: [String: String]
let timeSeriesDaily: [String:Forex]
enum CodingKeys: String, CodingKey {
case timeSeriesDaily = "Time Series (Daily)"
case metaData = "Meta Data"
}
}
struct Forex: Codable {
let open, high, low, close: String
enum CodingKeys: String, CodingKey {
case open = "1. open"
case high = "2. high"
case low = "3. low"
case close = "4. close"
}
}
}
一種方法是為此創建一個具有四個屬性的結構,並添加一個采用數組的特定 init
struct LastFour {
var close1: String
var close2: String
var close3: String
var close4: String
init?(_ closes: [String]) {
guard closes.count >= 4 else {
return nil
}
close1 = closes[0]
close2 = closes[1]
close3 = closes[2]
close4 = closes[3]
}
}
然后在從字典初始化結構時使用map
let lastFour = LastFour(requestedPrices.values.map {$0.close})
請注意,init 是可選的,如果數組太短,則返回 nil,例如,另一個選項可能是拋出錯誤。
也許更靈活的解決方案是在結構內部使用數組,然后通過方法或計算屬性訪問數據
struct LastFour {
private var closeEvents: [String]
func close(at index: Int) -> String {
}
}
這當然需要類似的代碼來初始化並檢查正確的大小,但是如果需要更多或更少的元素,更改會更容易
我的建議是使用日期和收盤價創建另一個結構
struct CloseData {
let date, price : String
}
並填充它
do {
let forex = try JSONDecoder().decode(Root.self, from: data)
let sortedKeys = forex.timeSeriesDaily.keys.sorted(by: >)
let requestedKeys = sortedKeys.prefix(4)
let requestedPrices = requestedKeys.map{ CloseData(date: $0, price: forex.timeSeriesDaily[$0]!.close) }
結果是CloseData
項的數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.