Свифт: «Неустранимая ошибка: newElements.underestimatedCount был завышен» - что означает эта ошибка? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть tableView, и он имеет источник данных в виде вычисляемого массива allItems :

var pendingItems: [Item] = []      
var loadingItems: [Item] = []      
var processedItems: [Item] = []

var allItems: [Item] {
        return processedItems + loadingItems + pendingItems
    }  

Иногда при запуске приложения я получаю эту ошибку: Поток 1:Неустранимая ошибка: newElements.underestimatedCount был завышен .

Похоже, это происходит, когда я пытаюсь достичь элемента по его индексу в этой функции:

    func getCellContent(at index: Int) -> (url: String, status: String) {
        return (url: queue.allItems[index].url, status: queue.allItems[index].status.description)
    }

Вот скриншот: https://www.dropbox.com/s/b9miuyiz1em56mk/Screen%20Shot%202019-04-12%20at%202.06.25%20PM.png?dl=1

Может кто-нибудьобъясните, почему это происходит?Буду очень признателен за любую помощь!

Методы источника данных (из контроллера представления):

extension WebSearchViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return presenter.getNumberOfRows()
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "WebPageTableViewCell", for: indexPath) as! WebPageTableViewCell
        let (url, status) = presenter.getCellContent(at: indexPath.row)
        cell.addressLabel.text = url
        cell.statusLabel.text = status
        return cell
    }
}

Методы помощи от докладчика:

    func getNumberOfRows() -> Int {
        return queue.allItems.count
    }

    func getCellContent(at index: Int) -> (url: String, status: String) {
        return (url: queue.allItems[index].url, status: queue.allItems[index].status.description)
    }

Это мой Item:

class WebPage: NSObject {
    var url: String
    var status: URLStatus

    init(url: String, status: URLStatus = .unchecked) {
        self.url = url
        self.status = status
    }

    func changeStatus(to newStatus: URLStatus) {
        self.status = newStatus
    }

    static func == (lhs: WebPage, rhs: WebPage) -> Bool {
        return lhs.url == rhs.url
    }
}

1 Ответ

0 голосов
/ 13 апреля 2019

Ваш код абсолютно в порядке, и его трудно назвать основной причиной ошибки.Вот некоторые ключевые особенности underestimatedCount, надеюсь, что это поможет в целях знания.

underestimatedCount обещает, что количество сборов не будет больше, чем количество элементов в последовательности и в последовательности протокол значение по умолчанию равно нулю. Проверка

@inlinable
  public var underestimatedCount: Int {
    return 0
  }

Более того, в протоколе сбора его значение по умолчанию совпадает с count. Проверка

@inlinable
  public var underestimatedCount: Int {
    // TODO: swift-3-indexing-model - review the following
    return count
  }

Поэтому из-за этой реализации по умолчанию прямое использование Collection * underestimatedCount определенно менее распространено, чем использование Sequence , так как Collection гарантирует неразрушающую итерацию, и в большинстве случаев underestimatedCount просто возвращает count.

Хотя, конечно, пользовательские типы коллекций могут обеспечивать собственную реализацию underestimatedCount - предоставлениенижняя граница того, сколько элементов они содержат, возможно, более эффективным способом, чем их реализация count, которая потенциально может быть полезной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...