Swift nil 与数组的合并运算符
Swift nil coalescing operator with array
我正在尝试创建一个简单的待办事项列表。
在介绍 Realm 或 coreData 之前,我想测试一下,看看是否一切顺利。
我知道我可能可以在某些 if 条件 下完成这项工作,但我希望能够使用 nil coalescing 运算符(我只是喜欢它的简单性),但我不确定为什么它不起作用。
我让它在没有它的情况下工作,但我真的很感兴趣它为什么会这样。
当我启动该应用程序时,它只显示 "No Category Added" 即使在我将一些项目添加到数组并打印出来之后,列表仍然保持不变。
import UIKit
class CategoriesTableView: UITableViewController {
var testData = [FauxData]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.reloadData()
}
// MARK: - Data Methods
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let data = testData[indexPath.row].categoryTitle ?? "No Category Added"
cell.textLabel?.text = data
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testData.count
}
@IBAction func addItem(_ sender: UIBarButtonItem) {
CreateNewItem(item: "test")
tableView.reloadData()
}
func CreateNewItem(item: String) {
let newItem = FauxData()
newItem.categoryTitle = item
testData.append(newItem)
print(item)
}
}
这是 class FauxData:
class FauxData {
var categoryTitle: String?
}
对不起,如果这太简单或重复,我找不到合适的答案。
不幸的是,索引空数组会崩溃,而不是 returning nil
,因此您不能使用 nil 合并运算符 。相反,使用 .isEmpty
属性 和 ?:
运算符来实现您的目标:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let data = testData.isEmpty ? "No Category Added" : testData[indexPath.row].categoryTitle
cell.textLabel?.text = data
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testData.isEmpty ? 1 : testData.count
}
注意:当数组为空时,您必须从 tableView(_:numberOfRowsInSection:)
return 1
,这样 tableView(_:cellForRowAt:)
将被调用到 return 您的默认消息.
如果您实施 safe array indexing,则可以使用 nil 合并运算符:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let data = testData[safe: indexPath.row]?.categoryTitle ?? "No Category Added"
cell.textLabel?.text = data
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testData.isEmpty ? 1 : testData.count
}
我正在尝试创建一个简单的待办事项列表。 在介绍 Realm 或 coreData 之前,我想测试一下,看看是否一切顺利。
我知道我可能可以在某些 if 条件 下完成这项工作,但我希望能够使用 nil coalescing 运算符(我只是喜欢它的简单性),但我不确定为什么它不起作用。
我让它在没有它的情况下工作,但我真的很感兴趣它为什么会这样。
当我启动该应用程序时,它只显示 "No Category Added" 即使在我将一些项目添加到数组并打印出来之后,列表仍然保持不变。
import UIKit
class CategoriesTableView: UITableViewController {
var testData = [FauxData]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.reloadData()
}
// MARK: - Data Methods
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let data = testData[indexPath.row].categoryTitle ?? "No Category Added"
cell.textLabel?.text = data
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testData.count
}
@IBAction func addItem(_ sender: UIBarButtonItem) {
CreateNewItem(item: "test")
tableView.reloadData()
}
func CreateNewItem(item: String) {
let newItem = FauxData()
newItem.categoryTitle = item
testData.append(newItem)
print(item)
}
}
这是 class FauxData:
class FauxData {
var categoryTitle: String?
}
对不起,如果这太简单或重复,我找不到合适的答案。
不幸的是,索引空数组会崩溃,而不是 returning nil
,因此您不能使用 nil 合并运算符 。相反,使用 .isEmpty
属性 和 ?:
运算符来实现您的目标:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let data = testData.isEmpty ? "No Category Added" : testData[indexPath.row].categoryTitle
cell.textLabel?.text = data
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testData.isEmpty ? 1 : testData.count
}
注意:当数组为空时,您必须从 tableView(_:numberOfRowsInSection:)
return 1
,这样 tableView(_:cellForRowAt:)
将被调用到 return 您的默认消息.
如果您实施 safe array indexing,则可以使用 nil 合并运算符:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let data = testData[safe: indexPath.row]?.categoryTitle ?? "No Category Added"
cell.textLabel?.text = data
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testData.isEmpty ? 1 : testData.count
}