有一个问题我无法理解,也无法找到答案:我在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过渡是有效的,我可以看到下一个表,但后来得到了致命的错误
好的,这是一个可能对其他人有帮助的初学者问题。
场景:我有一个复杂的 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,所以不要问我为什么他们这样做,但现在一切都正常了,这就是重点。
| 归档时间: |
|
| 查看次数: |
9408 次 |
| 最近记录: |