【问题标题】:Remove objects at specific indexes from Array in Swift 5从 Swift 5 中的 Array 中删除特定索引处的对象
【发布时间】:2021-03-02 03:55:40
【问题描述】:

我有一个字典数组和另一个数组,其中包含需要从第一个数组中删除的索引。我尝试将它们设为 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 是一个 IndexPaths 数组,例如:

(
"<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}"

)

有什么建议吗?提前致谢

【问题讨论】:

  • 你能说明listArray和listToBeRemoved是什么吗?这将使调试更容易
  • let indices = listToBeRemoved.map{ $0.row }.sorted(); indices.reversed().forEach{ listArray.remove(at: $0) } ?
  • @aheze 编辑了我的问题。谢谢
  • @Larme 之前已经尝试过...似乎破坏了我的字典并且仍然产生多个相同的对象
  • 它不应该破坏任何东西。但是listToBeRemoved 是否包含重复值。如果是这样,则需要使用let indices = Array(Set(listToBeRemoved.map{ $0.row })).sorted() 进行修复。

标签: arrays swift loops swift5


【解决方案1】:

你可以做什么:

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

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

所以,如果你使用的是 Swift 数组:

let indices = listToBeRemoved.map{ $0.row }.sorted()
indices.reversed().forEach{ listArray.remove(at: $0) }

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

另一种可能的解决方案:

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

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多