我想将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"
}
对于初学者来说,我会设置一个断点,从你正在击中的任何端点看看你的响应对象是什么样的。也许那些真的是数组的前三个元素?
继续讨论手头的问题,我会使用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。
祝好运!