Swift 后 json 解析变量被赋初值

Swift after json parsing variables are assigned to their initial values

我是 swift 的新手,如果这是一个愚蠢的问题,我很抱歉 我正在尝试扩展我在 macOS 开发方面的知识,并且正在尝试新事物 我正在从 url 中解析 json 文件 它在 do{}catch{} 括号中工作正常但是,我想在程序的其他部分使用我从 json 数据中获得的内容。

我创建了一些变量来存储这些值。

但是,一旦 do{}catch{} 执行完成,它们就会回到初始值 我如何存储我得到的值

@IBAction func buttonPressed(_ sender: Any) {
        var summonerNameGlobal: String = ""
        var summonerIdGlobal: String = ""
        var summonerPuuidGlobal: String = ""
        var summonerAccountIdGlobal: String = ""
        let jsonString = "https://na1.api.riotgames.com/lol/summoner/v4/summoners/by-name/john?api_key=\(apiKey)"
        guard let url = URL(string: jsonString) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}
            DispatchQueue.main.async {
                do {
                    let summoner = try JSONDecoder().decode(SummonerInfo.self, from: data)
                    self.summonerIdLabel.stringValue = summoner.id
                    summonerNameGlobal = summoner.name
                    summonerIdGlobal = summoner.id
                    summonerAccountIdGlobal = summoner.accountId
                    summonerPuuidGlobal = summoner.puuid
                } catch {
                    print(error)
                }
            }
        }.resume()
        print(summonerNameGlobal)
        print(summonerPuuidGlobal)
        print(summonerIdGlobal)
        print(summonerAccountIdGlobal)
    }

它们不会再次默认,但您在设置它们之前检查它们...因为 async function 需要一些时间才能从服务器获得响应,但是您的 print 语句 运行 immediately
您可以做的是在设置值后检查值

func callApi(completion: @escaping (SummonerInfo?)->Void){
       
        let jsonString = "https://na1.api.riotgames.com/lol/summoner/v4/summoners/by-name/john?api_key=\(apiKey)"
        guard let url = URL(string: jsonString) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}
            DispatchQueue.main.async {
                do {
                    let summoner = try JSONDecoder().decode(SummonerInfo.self, from: data)
                   completion(summoner)
                } catch {
                    completion(nil)
                    print(error)
                }
            }
        }.resume()
    }

    @IBAction func buttonPressed(_ sender: Any) {
       
        callApi { [weak self] info  in
            
            if let getInfo = info {
            print(getInfo.name)
            print(getInfo.id)
            print(getInfo.accountId)
            print(getInfo.puuid)
            } else  {
                print("data is nil")
            }
            
        }
        
      
    }