【问题标题】:.IsEmpty returns False.IsEmpty 返回 False
【发布时间】:2019-09-05 06:53:38
【问题描述】:

我正在使用以下代码检查数组是否为空,然后为 tableview 返回 0 行数以避免崩溃。但即使数组为空,它也不会返回 0 行计数并进入它不应该执行的 else 部分。因此,我的应用程序因索引超出范围异常而崩溃。

我曾尝试使用countisEmpty 进行两次检查,但即使数组为空,它仍会进入else 部分。

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if HomeVC.categoryDetail.count == 0{
        return 0
    }else{
        if(HomeVC.categoryDetail.isEmpty)
        {
            return 0
        }
        else
        {
            return HomeVC.categoryDetail.count + 3 as Int
        }
    }
}

我要保证在数组没有值的时候不会进入else部分。

【问题讨论】:

  • 打印HomeVC.categoryDetail,看看里面有什么
  • 能否附上cellForRow的代码?
  • 代码似乎正确。您的 HomeVC.categoryDetail 不为空。这就是它进入其他部分的原因。

标签: ios swift indexoutofboundsexception


【解决方案1】:

你不会的。实际上,您永远不会到达HomeVC.categoryDetail.isEmpty,因为您之前检查过HomeVC.categoryDetail.count == 0

注意 1:通常.isEmpty 比获取.count 性能要好得多。因为只要能查到最后一个索引就不需要统计item了。

计数复杂度:O(1) 如果集合符合 RandomAccessCollection;否则,O(n),其中 n 是集合的长度。 - Source

注2:不需要将count 转换为Int。因为它可以从UIntInt 自动完成。并且 count Int 的身份返回。

注意 3:在一行两个条件的情况下使用? :。它会阻止你使用额外的代码和未定义的状态。

所以代码是:

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return HomeVC.categoryDetail.isEmpty ? 0 : HomeVC.categoryDetail.count + 3
}

注意 4:在 return 之前尝试 print(HomeVC.categoryDetail) 看看里面是什么,当你希望它是空的时,它不是。

【讨论】:

  • 注意 1 对数组不正确,两个属性都是 O(1)。
  • @ielyamani 仅当集合符合 RandomAccessCollection 时,否则为 O(n),其中 n 是集合的长度。 Read Here
  • Array 不是已经符合了吗?!! OP 要求“以下代码检查数组是否为空”。你的那部分答案是错误的。
  • 我不能说,因为我没有看到 OP 的 array 来检查它是否符合。但是我稍微编辑了我的答案,以便更笼统。谢谢你的照顾。 @ielyamani
  • 这里不适合提及.isEmpty.count 对于非随机访问类型的区别。参见例如codereview.stackexchange.com/a/225439/49921。 “注 1”与此问题无关。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2015-08-02
相关资源
最近更新 更多