在Swift中枚举期间从数组中删除?
我想枚举Swift中的数组,并删除某些项目。 我想知道如果这是安全的,如果不是,我应该怎么做到这一点。
目前,我会这样做:
for (index, aString: String) in enumerate(array) { //Some of the strings... array.removeAtIndex(index) }
在Swift 2中,使用enumerate
和reverse
很容易。
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)
没有在焚烧过程中改变数组是不安全的,你的代码会崩溃。
如果您只想删除一些对象,则可以使用filter
function。
创build一个可变数组来存储要删除的项目,然后在枚举之后,从原始项目中删除这些项目。 或者,创build一个数组的副本(不可变),枚举枚举并从原始枚举中删除对象(而不是索引)。
我build议在枚举期间将元素设置为nil,并在使用数组filter()方法完成后删除所有空元素。