从 Swift 5 中的数组中删除特定索引处的对象

Remove objects at specific indexes from Array in Swift 5

我有一个字典数组和另一个数组,其中包含需要从第一个数组中删除的索引。我尝试使它们成为 IndexSet 并使用 removeObjects(at: indexes:IndexSet) 但失败了。有人知道怎么做吗?

print(listArray.count)
print(listToBeRemoved.count)`
let set = NSMutableIndexSet()
for (idx, index) in listToBeRemoved.enumerated(){
     set.add((index as! NSIndexPath).row)
     if idx == listToBeRemoved.count-1{
     listArray.removeObjects(at: set as IndexSet)
}
print(listArray.count)

日志打印: 111 24 87 但问题是 listArray 在其所有索引中包含相同的对象。在删除对象之前,所有对象都与预期不同。

ListArray 是一个字典数组,其中字典有 4 个键:

{
    Date = Date();
    Source = String;
    Title = String;
    Url = String;
}

而 listToBeRemoved 是一个索引路径数组,例如:

(
"<NSIndexPath: 0xf7e2dd0ccbb6f985> {length = 2, path = 0 - 63}",
"<NSIndexPath: 0xf7e2dd0cc916f985> {length = 2, path = 0 - 42}",
"<NSIndexPath: 0xf7e2dd0cc936f985> {length = 2, path = 0 - 43}",
"<NSIndexPath: 0xf7e2dd0cc9b6f985> {length = 2, path = 0 - 47}",
"<NSIndexPath: 0xf7e2dd0cca56f985> {length = 2, path = 0 - 48}"

)

有什么建议吗?提前致谢

你能做什么:

  • 获取所有索引
  • 降序排列
  • 迭代索引,并删除该索引处的项目

为什么反转了?因为否则,假设您有索引 [0, 1],并且您的数组是 [A, B, C] 如果您开始循环索引,您将拥有: 0:先从 [A, B, C] 移除 -> [B, C] 1: 从 [B, C] 中删除第二个 -> [B]

因此,如果您使用 Swift 数组:

let indices = listToBeRemoved.map{ [=10=].row }.sorted()
indices.reversed().forEach{ listArray.remove(at: [=10=]) }

由于您使用的是 NSMutableArray(我强烈建议您在 Stuff 可用时避免使用 NSStuff):listArray.remove(at: [=12=])listArray.removeObject(at: [=13=])

另一个可能的解决方案:

let indices = IndexSet(listToBeRemoved.map{ [=11=].row })
listArray.removeObjects(at: indices) //Objective-C
listArray.remove(attOffsets: indices) //Swift