Swift:来自 NSURLSession 任务的 Return JSON 字符串

Swift: Return JSON string from NSURLSession task

我想获取字符串类型的令牌,但是以下代码 returns 错误为“ "String" 无法转换为 "Void" ”。 你能告诉我问题是什么吗? 为了解析JSON,我使用了SwiftyJSON

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)")

            return token ///Error Here
        }
    }
    task.resume()
}

※1月6日编辑7:50(GMP+9hr) 我进行了如下编辑,但出现“"Use of unresolved identifier "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 闭包采用 return 类型的 void。 return 字符串的方法在 task.resume() 执行后立即结束,不会 return 任何东西。

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