[英]fatal error: NSArray element failed to match the Swift Array Element type
[英]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.