Swift 为什么我的变量的值发生了变化?

Swift 为什么我的变量的值发生了变化?,swift,foundation,Swift,Foundation,我调用了汇率货币的API,变量“taux”在类的开头定义。 因此,当我定义“taux”的值时,值很大(第一次打印(taux)),但在最后(最后一次打印(taux)),变量的值不同,它是变量的旧值。仅供参考,我检查了问题并不是来自for循环 if let url = URL(string: "https://api.exchangeratesapi.io/latest?base=CAD") { URLSession.shared.dataTask(with: url) { data,

我调用了汇率货币的API,变量“taux”在类的开头定义。 因此,当我定义“taux”的值时,值很大(第一次打印(taux)),但在最后(最后一次打印(taux)),变量的值不同,它是变量的旧值。仅供参考,我检查了问题并不是来自for循环

if let url = URL(string: "https://api.exchangeratesapi.io/latest?base=CAD") {
       URLSession.shared.dataTask(with: url) { data, response, error in
          if let data = data {
              do {
                let res = try JSONDecoder().decode(Currency.self, from: data)

                for rate in res.rates{

                    if rate.key == self.codeDevise{

                        self.taux = rate.value
                        print(self.taux)
                    }
                }

              } catch let error {
                 print(error)
              }
           }
       }.resume()
    }
    print(self.taux)

因为您误解了异步代码的工作原理。您创建一个URLSession DataTask,并对其调用resume。当您设置数据任务时,您会给它一个完成处理程序,以便在网络调用完成后调用


在数据任务将请求发送到远程服务器之前,对DataTask.resume的调用会立即返回。当代码最后一行的print语句运行时,数据任务甚至还没有开始执行,因此网络中的值还没有安装到实例变量中。

现在更清楚了!您是否有建议将价值储存在任务中,并将价值保留在任务之外?感谢您详细说明“将值存储在任务中,并将值保留在任务之外”?我只需要将API返回的结果(rate.value)分配给变量“taux”,然后再使用它,但我不知道如何才能做到这一点,只需放置断点并检查先调用哪一个即可