返回值未定义的Swift

时间:2017-06-20 00:39:21

标签: ios swift alamofire

我目前的职能如下:

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未定义。

1 个答案:

答案 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方法中删除强制解包。希望这可以解决你原来的问题。