Быстрый нулевой оператор объединения с массивом

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

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

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

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

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

Извините, если это слишком просто или дубликат, я не смог найти подходящий ответ.


person emin    schedule 14.05.2018    source источник
comment
Когда вы запускаете приложение, вы не должны видеть строки в таблице. Вам нужно нажать кнопку добавления, чтобы увидеть текстовый элемент.   -  person rmaddy    schedule 15.05.2018
comment
Но когда в массиве нет элементов, мне нужен текст «Категория не добавлена», и после ввода данных этот текст заменяется данными.   -  person emin    schedule 15.05.2018
comment
Чтобы было ясно, код, который вы разместили, будет отображать правильные данные, когда они есть, и ничего не будет показывать, когда данных нет. Таким образом, единственное изменение, которое вам нужно, это показать одну строку, когда нет данных. Это правильно?   -  person rmaddy    schedule 15.05.2018
comment
Именно так :)   -  person emin    schedule 15.05.2018


Ответы (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
}
person vacawama    schedule 15.05.2018
comment
Он не только работает как шарм, но еще и очень чистый и красивый код! Благодарю вас! Спасибо и за второе решение, я ЛЮБЛЮ безопасное индексирование массивов, никогда раньше такого не видел! Это выглядит так просто и интересно. p.s. я на самом деле не мог заснуть, пытаясь понять, почему он не работает должным образом, и я встал в 3:50 утра только для того, чтобы увидеть, как вы опубликовали ответ примерно в это время :) - person emin; 15.05.2018