返回值未定义斯威夫特
问题描述:
我现在的功能如下:返回值未定义斯威夫特
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
是不确定的。
答
此代码有多个问题。第一个也是最明显的是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
方法中的强制解包。但希望这可以解决你原来的问题。
您应该看到https://*.com/questions/27390656/how-to-return-value-from-alamofire – rmaddy
您还应该研究变量的范围。 – rmaddy