簡體   English   中英

在嘗試從類對象數組中讀取值時,收到“致命錯誤:NSArray元素無法匹配Swift數組元素類型”

[英]getting “fatal error: NSArray element failed to match the Swift Array Element type” when trying to read values from an array of class objects

有一個問題,我無法理解,也無法找到答案:我在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
        }
    }
}

然后在BookViewController我有這個只是為了測試:

var books = [Book]()

override func viewDidLoad() {
    super.viewDidLoad()

    print(books[0].name)
}

我可以看到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] = []

}

所以我在books var中獲得了一系列包含13個鍵/值對字典的書籍

當我試圖打印任何東西時,讓我們說:

print(books[0].name)

我收到錯誤:

致命錯誤:NSArray元素無法匹配Swift數組元素類型

我無法理解為什么......

ps過渡是有效的,我可以看到下一個表,但后來得到了致命的錯誤

在此輸入圖像描述

好吧,讓我們從你的錯誤開始吧。

致命錯誤:NSArray元素無法匹配Swift數組元素類型

一個快速陣列抱怨其中一個元素不是它所期望的。 NSArray元素與swift數組元素不匹配。

現在我們知道NSArray可以存儲不同類型的元素,例如,NSNumber,NSDictionary,NSString ......你得到了圖片。 很明顯,我們這里的問題與類型有關。

現在看看你的segue代碼我們可以看到我們實際上並沒有說明什么類型的書籍,我們讓swift的類型推斷為我們解決。 這是我們問題的第一個跡象。 你期待一個[Book]數組,但由於某種原因你得到了一種NSArray。

如果您從以下位置進行更改:

let books = categoryStore.allCategories[selectedIndexPath.row].books
let books : [Book] = categoryStore.allCategories[selectedIndexPath.row].books

您現在將在此行崩潰,因為您現在正在說明預期的類型。

完整方法:

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

            let destinationVC = segue.destinationViewController as! BookViewController
            destinationVC.books = books
        }
    }
}

這由調試器控制台輸出支持,它表示您有13個NSDictionary類型的數組

這意味着您需要調查填充[Book]數組的位置 - 即categoryStore.allCategories

好的,這是一個可能對其他人有幫助的初學者問題。

場景:我有一個復雜的JSON:root是對象,對象中的每個鍵都有一個數值(不同的鍵,但值具有相同的結構),值是Category對象! 對於每個類別,有許多鍵/值對,其中一個是Books KEY,值是數組或對象,每個都是一本書。

問題是:當我對JSON進行反序列化時,我使用一系列書籍解析了這些類別,但是注釋中提到的書籍並不是真正的書籍實例,而是更多的NSDictionary對象數組。

因此,在反序列化之后,我必須在Book類中添加一個init方法來獲取NSDictionary並將其解析為Book對象。

在每個類別之后,我必須查看NSArray的書籍,並為每一個創建一個Object go Book並返回一個書籍陣列。

這就行了,現在每件事都有效:

API:

// 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)
}

書類:

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]
}

如果我想撰寫書籍來掌握章節,我現在必須為章節做同樣的事情。

我沒有寫REST API,所以不要問我為什么這樣做,但現在每件事都有效,這就是它的重點。

在我的情況下,它只是在問題上面的代碼中轉換為錯誤的數組類型...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM