【发布时间】:2015-11-24 10:13:39
【问题描述】:
这是我的代码。您无需查看所有内容。我在困惑的地方添加了 cmets:
class ProductData: NSObject {
var title = ""
var icon = ""
private init(dict: NSDictionary){
title = dict["title"] as! String
icon = dict["icon"] as! String
super.init()
}
class func getTheData(fromJSONPath JSONPath: String) -> [ProductData] {
let JSONData = NSData(contentsOfFile: JSONPath)!
var JSONArray = [[String : AnyObject]]()
do {
JSONArray = try NSJSONSerialization.JSONObjectWithData(JSONData, options: NSJSONReadingOptions.MutableContainers) as! [Dictionary]
} catch { print("error")}
-----------------------------------------------------------------------------------------
//↓↓↓↓↓↓↓↓↓ different: data = "[AnyObject]()" or "[ProductData]()" ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
var data = [AnyObject]()
// var data = [ProductData]()
for d in JSONArray {
data.append(ProductData(dict: d))
}
return data as! [ProductData]
// return data
//↑↑↑↑↑↑↑↑↑ and here: return "data as! [ProductData]" or "data" ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}
}
我首先使用“var data = [ProductData](), retun data”。没有错误或警告,但是当我运行我的应用程序并运行到代码 data.append(ProductData(dict: d)) 时,它会因错误而崩溃:thread 1:exc_bad_access(code=1,address=0x10)。什么?!
我找到了解决方法:如果我使用var datas = [AnyObject]() 和return datas as! [ProductData],效果很好。
我很困惑:
- 为什么
[AnyObject]使代码正常? - 当我使用
[ProductData]时,为什么代码:data.append(ProductData(dict: d))会崩溃? -
[AnyObject]和[ProductData]有什么区别?
【问题讨论】:
-
何时/何地崩溃?
-
您的原始版本适用于我 (screenshot)(仅稍作修改以用于测试我的数据)。你不应该跳这个舞,别的东西惹麻烦了。
-
when:当我创建“ProductData”的实例并想要附加到 Array[ProductData] 时,它会崩溃,但是要附加到 Array[AnyObject] 的相同实例,它运行良好.其中:在此代码中:data.append(ProductData(dict: d))