Fatal error: Index out of range when updating data source of table
Fatal error: Index out of range when updating data source of table
任何人都可以解释为什么当我尝试向该数组添加项目时我的代码抛出索引超出范围吗?网络上的其他答案是基于情境的,并不能很好地理解如何纠正错误。
这是添加到数组的代码 -
@IBAction func refreshData(_ sender: Any) {
let type = "type"
let cost = dataAdded.shared.cost
let details = dataAdded.shared.details
let count = data?.count
(data!)[count! + 1] = [
"type" : type,
"details" : details,
"cost" : cost
] as! [String : String]
self.tableView.reloadData()
}
}
这里是生成 TableView 的代码 -
func numberOfRows(in tableView: NSTableView) -> Int {
return (data?.count)!
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let item = (data!)[row]
let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView
cell?.textField?.stringValue = item[(tableColumn?.identifier.rawValue)!]!
return cell
}
数组是这样声明的 -
var data: [[String: String]]?
这会是个问题吗?
您需要初始化数组,因为您当前的声明是 nil
var data = [[String: String]]()
并追加到数组中,最好有一个
struct Item {
let type:String
let details:String
let cost:String
}
var data = [Item]()
data.append(Item(type: type, details: details, cost: cost))
当您尝试在位置 count + 1
上设置元素时,您的数组未初始化,因为您只是定义了数组的类型。要解决此问题,请先创建空数组
var data = [[String: String]]()
那么您可以不在不存在的索引上分配元素,而是将新元素附加到您的数组
data.append(["type" : type,
"details" : details,
"cost" : cost])
任何人都可以解释为什么当我尝试向该数组添加项目时我的代码抛出索引超出范围吗?网络上的其他答案是基于情境的,并不能很好地理解如何纠正错误。
这是添加到数组的代码 -
@IBAction func refreshData(_ sender: Any) {
let type = "type"
let cost = dataAdded.shared.cost
let details = dataAdded.shared.details
let count = data?.count
(data!)[count! + 1] = [
"type" : type,
"details" : details,
"cost" : cost
] as! [String : String]
self.tableView.reloadData()
}
}
这里是生成 TableView 的代码 -
func numberOfRows(in tableView: NSTableView) -> Int {
return (data?.count)!
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let item = (data!)[row]
let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView
cell?.textField?.stringValue = item[(tableColumn?.identifier.rawValue)!]!
return cell
}
数组是这样声明的 -
var data: [[String: String]]?
这会是个问题吗?
您需要初始化数组,因为您当前的声明是 nil
var data = [[String: String]]()
并追加到数组中,最好有一个
struct Item {
let type:String
let details:String
let cost:String
}
var data = [Item]()
data.append(Item(type: type, details: details, cost: cost))
当您尝试在位置 count + 1
上设置元素时,您的数组未初始化,因为您只是定义了数组的类型。要解决此问题,请先创建空数组
var data = [[String: String]]()
那么您可以不在不存在的索引上分配元素,而是将新元素附加到您的数组
data.append(["type" : type,
"details" : details,
"cost" : cost])