Swift 3 - 将数组内的字典从JSON传递到另一个方法

时间:2016-10-06 14:29:21

标签: arrays json swift dictionary swift3

我有以下JSON:

// Benefit with angles outside -360° to +360°
float angle_degrees_reduce = fmodf(angle_degrees, 360.0f);
float angle_radians = angle_degrees_reduce * M_PI/180.0;

我正在以下列方式收集它(在一个函数内)(为简单起见,删除了保护措施):

{  
   "stores":2,
   "store_data":[  
      {  
         "store_id":1,
         "store_name":"Target"
         "store_color":"000000"
      },
      {  
         "store_id":2,
         "store_name":"Walmart"
         "store_color":"FFFFFF"
      }
   ]
}

并将其发送到辅助进程函数,定义为:

let task = URLSession.shared.dataTask(with: baseURL) { (data, response, error) in
    if let tmpRawData: NSDictionary = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary {
        process(rawData: tmpRawData)
    }
}

我在上面的函数中循环遍历数组时遇到了一些麻烦。最初,我曾尝试过:

func process(rawData: NSDictionary) -> Bool {
    if let storeDataArray = rawData["store_data"] {
        // Here I want to loop through the store_data array 
    }
}

但我是swift的新手,在NSArray,Array,Dictionary,NSDictionary等之间解密时遇到问题。我在Swift 3工作。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

首先,不要那么多注释类型。编译器会告诉您它是否需要显式注释

其次,为JSON字典声明类型别名很方便

typealias JSONObject = [String:Any]

这是任务,tmpRawData是一个字典 - 由JSON中的{}表示。

let task = URLSession.shared.dataTask(with: baseURL) { (data, response, error) in
  if let tmpRawData = try JSONSerialization.jsonObject(with: data, options: []) as! JSONObject {
    process(rawData: tmpRawData)
  }
}

process函数,类型别名使一切更具可读性 rawData的值是一个字典数组 - 在JSON中由[]表示。

func process(rawData: JSONObject) -> Bool {
  if let storeDataArray = rawData["store_data"]  as? [JSONObject] {
    for store in storeDataArray {
      let storeID = store["store_id"] as! Int
      let storeName = store["store_name"] as! String
      let storeColor = store["store_color"] as! String
     print(storeID, storeName, storeColor)
    }
  }
}

我不知道为什么所有教程都建议使用mutableContainers选项。在使用本机集合类型时,您根本不需要它。