SwiftyJSON - 从func返回json数组

时间:2015-07-29 13:07:21

标签: json swift function parsing return

我正在使用我的本地json api,它使用swiftyjson和alamofire接收和解析数据时效果很好,但是当它返回这些数据时,我遇到了一些麻烦:

import Alamofire
import SwiftyJSON

...

func getApi() -> Array<JSON> {

    let user = "user"
    let password = "password"

    Alamofire.request(.GET, "http://localhost/api/")
        .authenticate(user: user, password: password)
        .responseString { (req, res, body, error) in

            if let data = (body)!.dataUsingEncoding(NSUTF8StringEncoding) {

                let json = JSON(data: data)

                println(json) // works fine

                return json // does not work   
            }
    }
}

所以它打印&#34; JSON不能转换为Void&#34; ...

有人知道如何处理这件事吗?

你认为我正在使用alamofire进行&#34; http-basic-authentification&#34; ?

问候和感谢!

4 个答案:

答案 0 :(得分:4)

如果你的api返回一个JSON对象,alamofire会提供一个.responseJSON,而swiftyJSON可以包含该响应。

另外请不要忘记此请求是异步的,因此您可能需要在完成处理程序中获取这些结果,如下所示:

func getApi(completionHandler: (jsonResponse: JSON) -> () {
    let user = "user"
    let password = "password"

    Alamofire.request(.GET, "http://localhost/api/")
        .authenticate(user: user, password: password)
        .responseJSON { (req, res, JSON, error) in

                println(json) // works fine

                completionHandler(json)
            }
    }
}

像这样调用方法:

getAPI(completionHandler: { (response: JSON) -> () in
  // do something with your response. If the JSON contains an array you can iterate through it here.
}

接下来的好处是检查Alamofire doc上的“响应序列化”部分。

答案 1 :(得分:1)

您正在尝试在没有返回类型(Void)的块中返回JSON类型的对象。

答案 2 :(得分:1)

根据你的变量名,你应该设置

res = json 

res.setResponse(json)

或者像这样。现在无法检查,因为我现在远离我的Mac

答案 3 :(得分:1)

您的函数返回一个JSON数组:[JSON]

您正在尝试返回单个JSON类型对象。

更改return语句以返回数组:

return [json] // should work

编辑:我在发布答案时误读了代码。您正在调用异步方法Alamofire.request。该方法立即返回,但直到稍后才实际加载数据。您当前的设计无效。

@ Gwendle的答案是对的。您需要重构您的方法以获取完成块并将响应处理放在该完成块中。