从数组中删除特定值,而不是使用索引路径删除

时间:2019-03-11 14:04:18

标签: ios arrays tableview

我正在处理数组,应用程序的整体工作是用户可以选择必须添加到特定播放列表中的歌曲数。当用户单击tableview单元时添加了.checkmark时,我已经使用Tableview列出了歌曲。当已经找到对勾时,我将删除.checkmark,类似地,当用户选择歌曲时,我保留了一个数组来保存该特定歌曲的音轨ID 。 “ SongIDArray”是用于保存的数组。当用户取消选择歌曲时,我必须删除特定的歌曲“ track id”。但是在数组中它具有remove(at:index)我无法通过index删除它。请帮助我

例如:**我的数组是**

songIDArray = [25,45,69,78,63]

我需要在不知道索引路径的情况下从索引中删除78

3 个答案:

答案 0 :(得分:1)

您可以使用过滤器从数组中删除值:

let newArray = [25, 45, 69, 78, 63].filter { $0 != 78 }

答案 1 :(得分:1)

removeAll是有条件删除的命令。

var array = [25,45,69,78,63]
array.removeAll{$0 == 78}
print(array)

//[25, 45, 69, 63]

答案 2 :(得分:0)

您在这里有几种选择,最适合您的实际用例!

通过过滤删除

filter函数将数组中的每个元素传递给您提供的代码块,并删除您返回false的所有项。这对于执行简单的过滤器很有用,但是如果您还需要已删除项目的索引(例如,重新加载表视图索引路径),则不是很有用。

songIDArray = songIDArray.filter({ id in
    return id != 78
})

按索引删除

首先获取要删除的索引,您可以根据数组中项目的类型以多种方式执行此操作。如果它们符合Equatable(整数是),则可以使用

if let removalIndex = songIDArray.firstIndex(of: 78) {
    songIDArray.remove(at: removalIndex)
}

如果没有Equatable元素的数组,则可以使用index(where:)返回从所提供的闭包返回true的第一个索引:

if let removalIndex = songIDArray.index(where: { id in
    return id == 78
}) {
    songIDArray.remove(at: removalIndex)
}

如果您还需要对索引进行其他操作,例如在特定的索引路径上重新加载UITableViewCell以反映您的更改等,则此方法很有用。

全部删除

在Swift 4.2中,还有一个removeAll(where:)函数,其功能与filter类似,但不返回新数组:

songIDArray.removeAll(where: { id in
    return id == 78
})