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