Оператор быстрого слияния с массивом
Я пробую упражнение по созданию простого списка задач. Перед тем, как представить Realm или coreData, я хотел протестировать его и посмотреть, все ли идет гладко.
Я знаю, что, возможно, смогу выполнить эту работу при некоторых условиях, но мне бы хотелось использовать оператор объединения нулей (мне просто нравится его простота), и я не уверен, почему он не работает.
Я заставил это работать без этого, но действительно интересовался, по какой причине это ведет себя так.
Когда я запускаю приложение, оно просто показывает "Категория не добавлена", даже после того, как я добавляю некоторые элементы в массив и распечатываю их, список остается прежним.
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)
}
}
Это класс FauxData:
class FauxData {
var categoryTitle: String?
}
Извините, если это слишком просто или дубликат, я не смог найти и соответствующий ответ.
1 ответ
К сожалению, индексация пустого массива падает, а не возвращается 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
}
Примечание: вы должны вернуться 1
от tableView(_:numberOfRowsInSection:)
когда массив пуст, так что tableView(_:cellForRowAt:)
будет вызван, чтобы вернуть ваше сообщение по умолчанию.
Если вы реализуете безопасную индексацию массива, вы можете использовать оператор объединения 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
}