如何从循环中组合多个单独的json结果然后返回swift

问题描述 投票:1回答:1

我想将3个json结果合并为一个,以便稍后循环。

我已经尝试过互联网上的每一个组合,但我仍然陷入了死胡同。我正在调用一个API调用,作为响应,接收json数据。我想获得前3个结果并将该数据返回给调用方法,但是,我找不到找到所需响应的方法。

var data: JSON = []

func getData(forKey url: URL, completion: @escaping ([JSON]) -> Void){

        AF.request(url).responseJSON { (responseData) -> Void in
            if((responseData.result.value) != nil) {
                let swiftyJsonVar = JSON(responseData.result.value!)
                for loopID in 0 ... 2{
                    print(swiftyJsonVar["results"][loopID])
                }
            }
            return completion([self.data])
        }
    }

我期望的结果是

[
    {
        "name": "james",
        "location": "Mars"
    },
    {
        "name": "james",
        "location": "Mars"
    },
    {
        "name": "james",
        "location": "Mars"
    }
]

在我的循环中,当我收到时,x 3

{
    "name": "james",
    "location": "Mars"
}
swift swifty-json
1个回答
1
投票

对于初学者来说,我会设置一个断点,从你正在击中的任何端点看看你的响应对象是什么样的。也许那些真的是数组的前三个元素?

继续讨论手头的问题,我会使用Codable协议解码您的响应。我将跳过Alamofire部分并专注于解码对象。使用您的示例,这是结构的外观:

struct ResponseObject: Codable {
    let name: String
    let location: String
}

我会避免在你的代码中使用bang运算符(!),因为如果你告诉编译器它是100%有保证的钱,那么对象不是nil而实际上就是你将抛出异常。相反,打开选项。

您需要一个解码数据的登陆点,因此您可以声明一个空的响应数组,如下所示:

var arrayOfObjects: [ResponseObject] = []

然后,您只需声明一个解码器并解码您的数据:

let decoder = JSONDecoder()

do {
    if let data = rawData {
        arrayOfObjects = try decoder.decode([ResponseObject].self, from: data)
        print("number of objects:", arrayOfObjects.count)
        let slice = arrayOfObjects.prefix(3)
        arrayOfObjects = Array(slice)
        print("number of objects after slicing the array:", arrayOfObjects.count)
    }
} catch {
    print(error)
}

而不是循环遍历数组,只需使用.prefix(3)抓取数组的前三个元素。刚刚摆弄这个,我尝试用4前缀数组的前10个元素并且它没有产生异常,所以我认为这应该工作而不首先检查数组的计数。

我建议你在线查看Swift文档:Arrays,或者你可以得到一个非常甜蜜的Mac OS应用程序,叫做Dash,它允许你在本地机器上为一堆语言加载docsets。

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.