如何合并来自循环的多个单独 json 结果然后 return swift

How to combine multiple seperate json results from loop then return swift

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

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

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

对于初学者,我会放置一个断点,然后从您遇到的任何端点来看您的响应对象是什么样的。也许那些真的是数组的前三个元素?

继续手头的事情,我会使用 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 在线文档 re: Arrays 或者你可以得到一个非常棒的 Mac OS 应用程序叫 Dash,它可以让你加载文档集本地计算机上的一堆语言。

祝你好运!