在Swift中迭代数组的问题

时间:2017-09-26 08:56:15

标签: ios swift

我有一个json,其中包含一系列字典。我正在遍历数组以获取json中的元素,如此...

let prodId = prodArray.first?["product_id"] as? String

这给了我第一个索引的product_id。但我的阵列有10个元素。所以我正在使用for循环,如果我想获取数组中的所有id而不是我已经完成的第一个元素,我该怎么做...?

编辑:此外,这是我的json回复...

{
    "success": 1,
    "TotalRevenue": “123.12 K",
    "Productdata": [
        {
            "product_id": "5",
            "product_name": “abc”
            "product_images": [
                {
                    "id": "938",
                    "image": "http://myApp.direct.com/public165_1_image_15",
                    "is_default": "1"
                },
                {
                    "id": "939",
                    "image": "http://myApp.direct.com/public165_1_image_16",
                    "is_default": "0"
                }

            ]
        }

2 个答案:

答案 0 :(得分:0)

可能最好和最短的方法是使用flapMap

let productIds: [String] = prodArray.flapMap({ $0["product_id"] as? String })

flatMap允许您遍历数组并尝试以获取product_id值(因此,如果$0["product_id"] as? String没有值flatMap let jsonDict = // json, that converted into dictionary if let projectData = jsonDict["Productdata"] as? [[String: Any]] { let productIds = projectData.flatMap({ $0["product_id"] as? String }) let images = projectData.flatMap({ $0["product_images"] as? [[String: Any]] }).flatMap({ $0 }) let imageIds = images.flatMap({ $0["id"] as? String }) let imageURLs: [URL] = images.flatMap { image in guard let imageURL = image["image"] as? String, let url = URL(string: imageURL) else { return nil } return url } print(productIds) // ["5"] print(imageIds) // ["938", "939"] print(imageURLs) // [http://myApp.direct.com/public165_1_image_15, http://myApp.direct.com/public165_1_image_16] } 1}}过滤掉这个。)

UPD。

System.Management.Automation

另外,您可以try it online

答案 1 :(得分:0)

尝试以下代码。

if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as?  [String:Any] {

            if let productArray = jsonObj["Productdata"] as? [[String:Any]]{
              for product in productArray{

                   if let prodId = prodArray.first?["product_id"] as? String {
                }

             }
         }
    }