在尝试从类对象数组中读取值时,收到"致命错误:NSArray元素无法匹配Swift数组元素类型"

Ere*_*rez 5 ios swift swift2

有一个问题我无法理解,也无法找到答案:我在tableViewCOntroller中有这个方法,它在其中调用另一个带有TableView的viewCOntroller

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowBook" {
        if let selectedIndexPath = tableView.indexPathForSelectedRow {
            let books = categoryStore.allCategories[selectedIndexPath.row].books

            let destinationVC = segue.destinationViewController as! BookViewController
            destinationVC.books = books
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在BookViewController我有这个只是为了测试:

var books = [Book]()

override func viewDidLoad() {
    super.viewDidLoad()

    print(books[0].name)
}
Run Code Online (Sandbox Code Playgroud)

我可以看到books var是一个拿着书的数组:

class Book {
var name: String = ""
var id: Int = -1
var categoryId: Int = -1
var bookAuthor: String = ""
var level1Name: String = ""
var level2Name: String = ""
var level3Name: String = ""
var level4Name: String = ""
var levels: Int = -1
var orderKey: Int = -1
var viewCount: Int = -1
var viewLevel: Int = -1
var chapters: [AnyObject] = []
Run Code Online (Sandbox Code Playgroud)

}

所以我在books var中获得了一系列包含13个键/值对字典的书籍

当我试图打印任何东西时,让我们说:

print(books[0].name)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

致命错误:NSArray元素无法匹配Swift数组元素类型

我无法理解为什么......

ps过渡是有效的,我可以看到下一个表,但后来得到了致命的错误

在此输入图像描述

Ere*_*rez 2

好的,这是一个可能对其他人有帮助的初学者问题。

场景:我有一个复杂的 JSON:根是对象,对象中的每个键都有一个数值(键不同,但值具有相同的结构),该值是类别对象!对于每个类别,都有许多键/值对,其中一个是书籍键,值是数组或对象,每个键/值对都是一本书。

问题:当我反序列化 JSON 时,我用一系列书籍解析了类别,但评论中提到的书籍并不是真正的书籍实例,而是 NSDictionary 对象的数组。

因此,在反序列化 Category 后,我必须在 Book 类中添加一个 init 方法来获取 NSDictionary 并将其解析为 Book 对象。

之后,对于每个类别,我都必须检查书籍的 NSArray,并为每个类别创建一个对象,然后返回书籍数组。

这就成功了,现在一切都正常了:

应用程序编程接口:

// Getting NSArray of NSDictionary that represnets books and convert it into Books array
static func getBooksFromArr(booksArr: NSArray) -> [Book] {
    var books = [Book]()

    for book in booksArr {
        let thisBook = Book(bookDict: book as! NSDictionary)
        books.append(thisBook)
        print(book)
    }

    return books
}

// Parsing the category object
private static func CategoryFromJSONObject(json: [String: AnyObject]) -> Category? {
    guard let
        id = json["Id"] as? Int,
        name = json["Name"] as? String,
        booksArr = json["Books"] as? NSArray else {
            return nil
    }

    let books = getBooksFromArr(booksArr)

    return Category(name: name, id: id, books: books)
}
Run Code Online (Sandbox Code Playgroud)

图书类别:

init(bookDict: NSDictionary){
    self.name = (bookDict["Name"] ?? "") as! String
    self.id = (bookDict["Id"] ?? -1) as! Int
    self.categoryId = (bookDict["CategoryId"] ?? -1) as! Int
    self.bookAuthor = (bookDict["BookAuthor"] ?? "") as! String
    self.level1Name = (bookDict["Level1Name"] ?? "") as! String
    self.level2Name = (bookDict["Level2Name"] ?? "") as! String
    self.level3Name = (bookDict["Level3Name"] ?? "") as! String
    self.level4Name = (bookDict["Level4Name"] ?? "") as! String
    self.levels = (bookDict["Levels"] ?? -1) as! Int
    self.orderKey = (bookDict["OrderKey"] ?? -1) as! Int
    self.viewCount = (bookDict["ViewCount"] ?? -1) as! Int
    self.viewLevel = (bookDict["ViewLevel"] ?? -1) as! Int
    self.chapters = (bookDict["Chapters"] ?? []) as! [AnyObject]
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想写书来容纳这些章节,我就必须对这些章节做同样的事情。

我没有编写 REST API,所以不要问我为什么他们这样做,但现在一切都正常了,这就是重点。