Swift 3:NSArray元素无法匹配Swift数组元素类型

时间:2016-09-29 12:35:40

标签: json swift3

我试图在下面的swift 3中解析JSON是我的JSON文件。并尝试进入我声明的类数组。但是得到错误:致命错误:NSArray元素无法匹配Swift数组元素类型。

{
"Headers": [
            {
            "headerName": "Home",
            "sortByNo" : 1,
            "headerImageName": "header0",
            "viewCotrollerName": "InitialViewController"

            },
            {
            "headerName": "About",
            "sortByNo" : 2,
            "headerImageName": "header1",
            "viewCotrollerName": ""
            },
            {
            "headerName": "Timing",
            "sortByNo" : 3,
            "headerImageName": "header3",
            "viewCotrollerName": "TimingViewController"
            }
        ]
}


  // Class Type 
class JsonObjectClass {

var headerName = ""
var sortByNo = ""
var headerImageName = ""
var viewControllerName = ""

}

var array = [JsonObjectClass]() // my array of class type

//JSON Parsing Code
 func parseLocalFile() {

    let url = Bundle.main.url(forResource: "HeaderFileD", withExtension: "json")
    let data = NSData(contentsOf: url!)

    do {
        let jsonData = try JSONSerialization.jsonObject(with: data! as Data, options: .mutableContainers) as! NSDictionary

        array = jsonData.object(forKey: "Headers") as! [JsonObjectClass]

   // I am getting error here "fatal error: NSArray element failed to match the Swift Array Element type"         
        for arr in array {
            print(arr)

        }

    } catch {

    }
}

1 个答案:

答案 0 :(得分:0)

您无法直接将数组或词典分配给自定义类。 您需要通过创建类的实例来映射数组。

我将类更改为结构以获取成员方式的初始化程序。顺便说一下,密钥sortByNo的值是Int

struct JsonObjectClass {
  var headerName = ""
  var sortByNo = 0
  var headerImageName = ""
  var viewControllerName = ""
}

var array = [JsonObjectClass]() // my array of class type

//JSON Parsing Code
func parseLocalFile() {

  guard let url = Bundle.main.url(forResource: "HeaderFileD", withExtension: "json") else { return }

  do {
    let data = try Data(contentsOf: url)
    let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as! [String:Any]
    let jsonArray = jsonData["Headers"] as! [[String:Any]]
    array = jsonArray.map { JsonObjectClass(headerName: $0["headerName"] as! String,
                                   sortByNo: $0["sortByNo"] as! Int,
                                   headerImageName: $0["headerImageName"] as! String,
                                   viewControllerName: $0["viewCotrollerName"] as! String)}

    for arr in array {
      print(arr)
    }

  } catch let error as NSError {
    print(error)
  }
}

PS:考虑拼写错误viewControllerName vs viewCotrollerName