在Swift中枚举期间从数组中删除?

我想枚举Swift中的数组,并删除某些项目。 我想知道如果这是安全的,如果不是,我应该怎么做到这一点。

目前,我会这样做:

for (index, aString: String) in enumerate(array) { //Some of the strings... array.removeAtIndex(index) } 

在Swift 2中,使用enumeratereverse很容易。

 var a = [1,2,3,4,5,6] for (i,num) in a.enumerate().reverse() { a.removeAtIndex(i) } print(a) 

看到我的swiftstub在这里: http ://swiftstub.com/944024718/?v=beta

你可以考虑filter方式:

 var theStrings = ["foo", "bar", "zxy"] // Filter only strings that begins with "b" theStrings = theStrings.filter { $0.hasPrefix("b") } 

filter的参数只是一个闭包,它接受一个数组types的实例(在这里是String )并返回一个Bool 。 当结果为true它保持该元素,否则该元素被滤除。

当某个索引处的元素从数组中移除时,所有后续元素将改变它们的位置(和索引),因为它们向后移位一个位置。

所以最好的方法是以相反的顺序导航数组 – 在这种情况下,我build议使用传统的for循环:

 for var index = array.count - 1; index >= 0; --index { if condition { array.removeAtIndex(index) } } 

但是在我看来,最好的方法是使用filter方法,正如@perlfly在他的回答中所描述的那样。

Swift 3中 ,这将是:

根据约翰斯顿的回答,

 var a = [1,2,3,4,5,6] for (i,num) in a.enumerated().reversed() { a.remove(at: i) } print(a) 

string作为OP的问题:

 var b = ["a", "b", "c", "d", "e", "f"] for (i,str) in b.enumerated().reversed() { if str == "c" { b.remove(at: i) } } print(b) 

没有在焚烧过程中改变数组是不安全的,你的代码会崩溃。

如果您只想删除一些对象,则可以使用filterfunction。

创build一个可变数组来存储要删除的项目,然后在枚举之后,从原始项目中删除这些项目。 或者,创build一个数组的副本(不可变),枚举枚举并从原始枚举中删除对象(而不是索引)。

我build议在枚举期间将元素设置为nil,并在使用数组filter()方法完成后删除所有空元素。