我目前的职能如下:
public func getToken() -> String {
Alamofire.request("url", method: .post, encoding: JSONEncoding.default)
.responseData { response in
if let data = response.data {
let xml = SWXMLHash.parse(data)
let token = ((xml["authResponse"] ["authToken"].element?.text))!
}
}
return token // Test is undefined down here
}
我试图让这个函数返回令牌字符串,但变量token
未定义。
答案 0 :(得分:0)
此代码存在多个问题。第一个也是最明显的是token
仅在内部闭包内的范围内,因此未定义return
语句所在的位置。但是,第二个问题是您的Alamofire请求将异步进行,但getToken
方法的签名假定结果值将同步提供。
我建议更改方法的签名,以接受另一个闭包作为参数作为"回调"方法。这些方面的东西:
public func getToken(callback: ((String?) -> Void)) -> String {
Alamofire.request("url", method: .post, encoding: JSONEncoding.default)
.responseData { response in
if let data = response.data {
let xml = SWXMLHash.parse(data)
let token = ((xml["authResponse"] ["authToken"].element?.text))!
callback(token)
} else {
callback(nil)
}
}
}
然后,您可以这样称呼它:
getToken(callback: { token in
if let token = token {
print("Got the token: \(token)")
} else {
print("Didn't get the token: ¯\_(ツ)_/¯")
}
})
您可能希望添加一些更强大的错误处理,并且可能是一种消除错误与返回的实际nil
值之间的歧义(如果可能的话)。我还建议您在getToken
方法中删除强制解包。希望这可以解决你原来的问题。