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

Posted

技术标签:

【中文标题】Swift 3:NSArray 元素无法匹配 Swift Array 元素类型【英文标题】:Swift 3: NSArray element failed to match the Swift Array Element type 【发布时间】:2016-09-29 12:35:40 【问题描述】:

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


"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】:

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

我将类更改为结构以获取成员初始化器。顺便说一句,键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

【讨论】:

以上是关于Swift 3:NSArray 元素无法匹配 Swift Array 元素类型的主要内容,如果未能解决你的问题,请参考以下文章

Firebase iOS Swift 致命错误:NSArray 元素无法匹配 Swift Array 元素类型

NSArray元素的原因无法与Swift数组元素类型匹配

Firestore NSArray 到 Swift.Array 匹配错误

Strange Down-casted Array 元素无法匹配 Swift 3 中的目标类型问题

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

Swift json 解析错误:无法将 NSCFConstantString 类型的值转换为 NSArray