【问题标题】:Initialization and Storage Error of API DataAPI数据初始化和存储错误
【发布时间】: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()
    }
}

【问题讨论】:

    标签: swiftui ios14


    【解决方案1】:

    如果您尝试解码从URLSession 获得的结果,那么您应该从dataTask 闭包中传递data,而不是传递Data(moneyRates) 来解码:

    let result = try JSONSerialization.jsonObject(with: data) as! [String:Any]
    

    【讨论】:

    • 感谢您向我指出这一点。现在我看到错误“从初始化程序返回而不初始化所有存储的属性”(self.moneyRates 未初始化)
    • 在您定义 moneyRates 的行中添加“= []”
    • 我的结构初始化好像有问题。模型是 struct MoneyRates { let date: String let base: String let rates: [String: Double] } 而在类 CurrencyRates: ObservableObject { @Published var moneyRates: [MoneyRates] 看起来我有多个日期和基数副本.
    • 我看到了多个费率。不确定日期。我是否回答了您最初关于编译错误的问题?
    • 是的,我可以总结一下,问一个新问题,如果我能解决初始化问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2016-06-21
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多