【发布时间】:2021-06-08 22:14:30
【问题描述】:
我遇到了汇率 API 初始化/存储问题。我读了一些货币汇率,并希望将数据暂时存储在 moneyRates 中,然后将数据作为有序数据移动到 rateArray。我收到错误“调用初始化程序时没有完全匹配”。错误发生在以“let result = try JSONSerialization ...”开头的行。我还在侧边栏中看到一条消息(Xcode gray!)“/Foundation.Data:29:23:候选人要求类型'MoneyRates'和'UInt8'是等效的(要求指定为'S.Element'==' UInt8')"。我猜我需要用某种格式信息初始化 moneyRates。
我想解释一下moneyRates 错误以及如何解决它。在这一点上,我不关心 rateArray。感谢您的帮助。
struct MoneyRates {
let date: String
let base: String
let rates: [String: Double]
}
class CurrencyRates: ObservableObject{
@Published var moneyRates: [MoneyRates]
@Published var rateArray = [Double] ()
init() {
if UserDefaults.standard.array(forKey: "rates") != nil {
rateArray = UserDefaults.standard.array(forKey: "rates") as! [Double]
} else {
rateArray = [Double] (repeating: 0.0, count: 170)
UserDefaults.standard.set(self.rateArray, forKey: "rates")
}
}
// retrieve exchange rates for all 150+ countries from internet and save to rateArray
func updateRates(baseCur: String) {
let baseUrl = "https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/latest/currencies/"
let requestType = ".json"
guard let url = URL(string: baseUrl + baseCur + requestType) else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
do {
let result = try JSONSerialization.jsonObject(with: Data(moneyRates)) as! [String:Any] // <-- error is occurring here
var keys = Array(arrayLiteral: result.keys)
if let dateIndex = keys.firstIndex(of: "date"),
let date = result[keys[dateIndex]] as? String, keys.count == 2 {
keys.remove(at: dateIndex)
let base = keys.first!
let rates = MoneyRates(date: date, base: base, rates: result[base] as! [String:Double])
print(rates)
}
} catch {
print(error)
}
}
}.resume()
}
}
【问题讨论】: