Swift:从NSURLSession任务返回JSON字符串

Swift:从NSURLSession任务返回JSON字符串,json,string,swift,nsurlsession,Json,String,Swift,Nsurlsession,我希望以字符串类型获取令牌,但是以下代码返回错误,因为“String”不能转换为“Void”。 你能告诉我有什么问题吗? 为了解析JSON,我使用 ※编辑日期:1月6日7:50(GMP+9小时) 我编辑如下,但我得到的错误是“使用未解析标识符”tokenString。 请告诉我如何解决这个问题 func authentication() -> String { let request = NSMutableURLRequest(URL: NSURL(string: "https:/

我希望以字符串类型获取令牌,但是以下代码返回错误,因为“String”不能转换为“Void”。 你能告诉我有什么问题吗? 为了解析JSON,我使用

※编辑日期:1月6日7:50(GMP+9小时) 我编辑如下,但我得到的错误是“使用未解析标识符”tokenString。 请告诉我如何解决这个问题

func authentication() -> String {
    let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!)
    request.HTTPMethod = "POST"

    var loginID = "my_ID"
    var apiKey = "my_APIKEY"
    var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)"

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            println("error=\(error)")
            return
        }

        println("response = \(response)")

        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString)")


        let json = JSON(data:data)
        if let token = json["auth_token"].stringValue{
            println("\(token)")

            tokenString = self.didReceiveAuthToken(token)///Edited 
        }
    }
    task.resume()
    return tokenString
}
func didReceiveAuthToken(token : String) ->String{
    return token
}

dataTaskWithRequest
闭包的返回类型为
void
。返回字符串的方法在执行
task.resume()
后立即结束,不返回任何内容


您的基本问题是,您正在将同步思维应用于异步任务。一个简单的建议是让
authentication()
返回void(即nothing),然后创建一个单独的方法,如
didReceiveAuthToken(token:String)
,当收到令牌时,您的完成处理程序将调用该方法。

我根据上述建议编辑代码,但是,我无法获取身份验证函数之外的令牌字符串。你能告诉我怎么做吗?调用你创建的方法,使用令牌作为参数。一个简单的委托模式,调用一个方法并将数据传递回另一个类不是一个很好的解决方案吗?@Woodstock委托处理程序在某些情况下是可以的,但有时它会把事情搞得一团糟,因为数据并不总是按照请求的顺序返回,所以您可能会遇到同步问题。在这种特殊情况下,它可能是好的。
func authentication() -> String {
    let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!)
    request.HTTPMethod = "POST"

    var loginID = "my_ID"
    var apiKey = "my_APIKEY"
    var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)"

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            println("error=\(error)")
            return
        }

        println("response = \(response)")

        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString)")


        let json = JSON(data:data)
        if let token = json["auth_token"].stringValue{
            println("\(token)")

            tokenString = self.didReceiveAuthToken(token)///Edited 
        }
    }
    task.resume()
    return tokenString
}
func didReceiveAuthToken(token : String) ->String{
    return token
}