gpt4 book ai didi

swift - 在 Swift 中有选择地从 NSMutableArray 中移除和删除对象

转载 作者:搜寻专家 更新时间:2023-10-30 22:21:31 25 4
gpt4 key购买 nike

基本问题。在 Swift 中从可变数组中有选择地移除和删除项的最佳方法是什么?

有些选项似乎不适合这种情况,例如在

中调用 removeObject
  • for 循环
  • 枚举 block

和其他似乎一般都有效的

  • for 循环 使用索引 + 调用 removeObjectAtIndex,甚至在循环内
  • for in loop 用于填充 arrayWithItemsToRemove,然后使用 originalArray。removeObjectsInArray(arrayWithItemsToRemove)
  • 使用.filter 来创建一个新的数组似乎真的很不错,但我不太确定我对替换整个原始数组的感觉

是否有推荐的、简单且安全的方法来从数组中删除项目?我提到的其中一个或我缺少的东西?

如果对此有不同的看法(有利有弊)或偏好,那就太好了。我仍在努力选择合适的。

最佳答案

如果你想根据条件从 NSMutableArray 中循环和删除元素,你可以以相反的顺序循环数组(从最后一个索引到零),并删除满足条件的对象。

例如,如果您有一个整数数组并且想要删除可被三整除的数字,您可以像这样运行循环:

var array: NSMutableArray = [1, 2, 3, 4, 5, 6, 7];

for index in stride(from: array.count - 1, through: 0, by: -1) {
if array[index] as Int % 3 == 0 {
array.removeObjectAtIndex(index)
}
}

以相反顺序循环可确保仍要检查的数组元素的索引不会更改。相反,在转发模式下,如果您删除第一个元素,那么之前位于索引 1 的元素将更改为索引 0,您必须在代码中考虑到这一点。

出于性能原因,不建议在循环中使用 removeObject(不适用于上述代码),因为它的实现遍历数组的所有元素并使用 isEqualTo 判断是否移除对象。复杂度顺序从 O(n) 提高到 O(n^2) - 在最坏的情况下,删除数组的所有元素,在主循环中遍历一次数组,并为每个元素再次遍历大批。因此,应避免所有基于枚举 block 、for-in 等的解决方案,除非您有充分的理由。

filter 是一个很好的选择,我会使用它,因为:

  • 它简洁明了:与基于索引的解决方案的 5 行代码(包括右括号)相比,只有 1 行代码
  • 它的性能与基于索引的解决方案相当——它有点慢,但我认为没那么慢

虽然它可能并不适用于所有情况,因为正如您所说,它会生成一个新数组而不是就地操作。

关于swift - 在 Swift 中有选择地从 NSMutableArray 中移除和删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25699987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com