2017-06-20 84 views
1

我现在的功能如下:返回值未定义斯威夫特

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

您应该看到https://stackoverflow.com/questions/27390656/how-to-return-value-from-alamofire – rmaddy

+0

您还应该研究变量的范围。 – rmaddy

回答

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