首页 > 解决方案 > var 变量未在 Alamofire Closure 中设置

问题描述

我是 Swift 开发的新手,遇到以下问题:

我通过 Alamofire 进行休息调用以从 REST API 获取数据,但如果我将类属性设置为返回值之一,则它不起作用。其余调用完成后,defaultBotId 仍为空字符串。

如果我查看控制台,它会显示应该设置为该变量的正确字符串 print("Closure: ", defaultBot.defaultBotId)

在我看来,如果我在一个闭包内,那是不可能更改类属性的,或者这里有什么问题?

这是我来自 SinusbotSDK.swift 的代码

import Foundation
import Alamofire

public class SinusbotSDK {
    let host: String
    let username: String
    let password: String
    var defaultBotId: String
    
    public init(host: String, username: String, password: String, defaultBotId: String = "") {
        self.host = host
        self.username = username
        self.password = password
        self.defaultBotId = defaultBotId
    }
    
    public func fetchDefaultBotId() {
        AF.request(self.host + "/api/v1/botId")
            .validate()
            .responseDecodable(of: DefaultBot.self) {
                response in guard let defaultBot = response.value else {return}
                self.defaultBotId = defaultBot.defaultBotId
                print("Closure: ", defaultBot.defaultBotId)
            }
    }
    
    public func printVar() {
        print(self.defaultBotId)
    }
}

这是我调用 fetchDefaultBotId() 和 printVar() printVar 的代码,因为字符串仍然为空

import SwiftUI
import SinusbotSDK

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
        
        Button(action: {
            let sinusbot = SinusbotSDK(host: "myHost", username: "myUser", password: "myPassword")
            
            sinusbot.fetchDefaultBotId()
            sinusbot.printVar()
        }){
            Text("Press me")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

标签: iosswiftrestalamofireswift5

解决方案


推荐阅读