在我的' DictionaryTableViewController中:UITableViewController' class I定义以下变量:
var dataObj : [String: AnyObject]!
var letters : Int!
var currentSection : Int!;
var currentRow : Int!
在' viewDidLoad'我有:
let jsonUrl = NSBundle.mainBundle().URLForResource("dictionary", withExtension: "json")
var data = NSData(contentsOfURL: jsonUrl!)
func dataReturn(object: [String: AnyObject]) {
dataObj = object
letters = object["collection"]!.count
}
do {
let object = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
if let dictionary = object as? [String: AnyObject] {
dataReturn(dictionary)
}
} catch {
// Handle Error
}
这是我从NSBundle
中提取的JSON文件的基本结构 {
"collection": [{
"letter": "A",
"words": [{
"word" : "Apple",
"definition" : "Tasty fruit"
}]
},{
"letter": "B",
"words": [{
"word" : "Banana",
"definition" : "Meh, not bad."
}]
},{
"letter": "C",
"words": [{
"word" : "Carrots",
"definition" : "hooock twooo!"
}]
}]
}
所以现在当我为tableView单元格设置样式时,我认为这是导致此错误的原因:
命令因信号失败:分段错误:11
- 为表格'发出SIL' at / Users / me / Desktop /.../ DictionaryTableViewController.swift:70:14
醇>
作为警告我刚刚在更新到xcode 7.3后遇到此问题。这个问题在7.2
中没有出现从错误说明的地方到第70行:
Line 70: override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
//let currentSelection = dataObj["collection"]![indexPath.section]["words"]!![indexPath.row]!
let currentSelection = dataObj["collection"]![indexPath.section]["words"]!![indexPath.row]!!!
cell.textLabel?.text = currentSelection["word"] as? String
cell.detailTextLabel?.text = currentSelection["definition"] as? String
return cell
}
注意:上面代码中注释掉的行在xcode 7.2中正常工作。 Xcode7.3给了我一个语法错误(不明确使用下标)。注释掉的行下方的代码是我的更改,不会产生语法错误。这是导致我的问题的原因吗?我在这里真的很茫然,似乎无法找到答案。任何帮助表示赞赏!
答案 0 :(得分:1)
出于调试目的,我会将所有强制解包的选项分解为一系列这样的一系列保护语句:
guard let collection = dataObj["collection"] else { fatalError("collection is nil") }
guard let words = collection[indexPath.section]["words"] else { fatalError("words is nil") }
guard let word = words[indexPath.row] else { fatalError("word is nil") }
无论如何,这样的事情会告诉你其中一个强行解开的选项是否导致问题。