Оператор быстрого слияния с массивом - PullRequest
0 голосов
/ 15 мая 2018

Я пробую упражнение по созданию простого списка задач. Перед тем как представить Realm или coreData, я хотел протестировать его и посмотреть, все ли идет гладко.

Я знаю, что, вероятно, смогу сделать эту работу с некоторыми , если условия , но я бы хотел использовать оператор nil coalescing (мне просто нравится его простота), и я не уверен, почему он не работает.

Я заставил это работать без него, но действительно интересовался, по какой причине он так себя ведет.

Когда я запускаю приложение, оно просто показывает «Категория не добавлена» даже после того, как я добавляю некоторые элементы в массив и распечатываю их, список остается прежним.

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 Ответ

0 голосов
/ 15 мая 2018

К сожалению, индексация пустого массива завершается с ошибкой, а не возвращается nil, поэтому вы не можете использовать оператор nil coalescing . Вместо этого используйте свойство .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 coalescing :

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
}
...