Swift:删除所有数组元素


108

我试图用这样的for循环删除所有数组元素:

for index 1...myArray.count {
   myArray.removeAtIndex(index)
}

但这是行不通的,在扩建之前我得​​到了这个错误:

预期为“;” 在“ for”语句中


5
简单。重新初始化数组...
VJ

Answers:


326

有一种方法(实际上是一种功能)

myArray.removeAll()

1
不知道这件事,谢谢+1
JamesG '16

11
@NoodleOfDeath严格说来,Swift数组是structs,而结构具有functions不同于的类methods
vadian

1
@vadian +1进行说明。我忘了Arrays为struct秒。这里有经验丰富的Objective-C编码器...
NoodleOfDeath '16

1
在退出用于初始化视图的视图(viewcontroller)时是否需要调用removeAll()函数,还是它自己消失了?
Famic Tech

1
@FamicTech这取决于:如果卸载了视图,则隐式消失,如果视图仅消失,则必须调用removeAll()。但是,当视图消失时,删除所有不必要的数据是一种很好的做法(内存规范)。
vadian

17

理所当然的是,@ vadian的答案是解决方案,我只想指出您的代码不起作用。

首先,数组索引从0开始,因此您应该相应地重写范围:

for index 0..<myArray.count {
   myArray.removeAtIndex(index)
}

但是,此实现将导致崩溃。如果您有10个元素组成的数组,则最后一个元素将占据索引9的位置。

使用该循环,在第一次迭代时,将删除索引为0的元素,这将导致最后一个元素向下移至索引8。

在下一次迭代中,将删除索引为1的元素,最后一个元素将在索引7下移。依此类推。

在循环中的某个时刻,尝试删除不存在的索引的元素将导致应用程序崩溃。

在循环中从数组中删除元素时,最好的方法是以相反的顺序遍历它:

for index in reverse(0..<myArray.count) {
    myArray.removeAtIndex(index)
}

这样可以确保删除的元素不会更改要处理的元素的顺序或索引。


1
有一个功能可以仅删除一行中的所有元素。作为@vadian的答案...
VJ

3
@VJ这就是我在回答的第一行中写的内容:)
Antonio

+1表示可用于删除对象的特定实例的解决方案。我public extension Array where Element : Equatable { public mutating func remove(element: Element) -> Int { var occurrences = 0; for index in (0 ..< count).reverse() { if self[index] == element { removeAtIndex(index); occurrences += 1 } }; return occurrences } }最好不要全部使用一行,但是代码应该在一行上编译
NoodleOfDeath '16

为什么不for _ in 0...<myArray.count { myArray.removeAtIndex(0) }呢?我对效率还不是很了解,但是通过这种方式,您无需反转范围,所以也许更快。
cbjeukendrup

那也行!就效率而言,方法是相同的,您从开头而不是结尾删除,但是保存了一个变量:-)
Antonio

7

您缺少in引起错误的关键字。代码应为:

for index in 1...myArray.count {
    myArray.removeAtIndex(index)
}

但是,由于以下几个原因,这将无法正常工作:

  • 最后一个有效索引是count - 1要求1..<myArray.count
  • 更重要的是,从数组中删除元素会缩短元素,从而每次都会更改索引。

如果要尝试从阵列中删除所有内容,则应按照其他人的建议进行操作并使用:

myArray.removeAll()

如果您只想要第一个元素,而没有其他任何东西,则可以获取对第一个对象的引用,清空数组,然后重新添加该对象:

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)

对不起,我没有看到“在” ...难道+1
VJ

1
(+1)用于解释实际错误。(-1),因为这将不起作用,因为删除项目会使数组更短。(另请注意,最后一个有效索引是count - 1)。
Martin R

7

如果您确实要清除数组,最简单的方法是重新初始化它。


3

您的代码应该可以正常工作,这是不可能的。

迅捷3

existingArray = []

这样,您可以将一个空数组重新分配给现有数组,并引用数据类型。

或者,您可以使用removeAll来从阵列中删除所有元素,并提供一个选项来保留现有容量。

existingArray.removeAll()

这是一个mutating函数,表示调用该方法的数组将被更改(空)。


2

凯尔(Kyle)走在正确的道路上,但是他的代码将失败,因为枚举期间可能的索引减少,从而导致非法索引。

解决该问题的一种方法是向后枚举。可以通过大步向前迅速完成。

for index in stride(from: myArray.count - 1, through: 0, by: -1) {
    myArray.removeAtIndex(index)
}

另一个选择是使用 filter()

斯威夫特1.2

myArray = filter(myArray, { (obj) -> Bool in
    return false
})

迅捷2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}

很有意思!我不知道stride
凯尔·德科特

1

removeAllObjects()中夫特2可用的方法

Syntax :  public func removeAllObjects()
Eg.:   mainArray.removeAllObjects

要删除特定索引处的元素,请使用:

Syntax : public func removeObjectAtIndex(index: Int)
Eg.: mainArray.removeObjectAtIndex(5)

要删除最后一个元素,请使用:

Syntax : public func removeLastObject()
Eg.: mainArray.removeLastObject()

要删除特定范围内的元素,请使用:

Syntax : public func removeObject(anObject: AnyObject, inRange range: NSRange)

要删除特定元素,请使用:

Syntax : public func removeObject(anObject: AnyObject)

下面的屏幕快照显示了NSMutableArray扩展中可用的方法列表

屏幕截图1


0

您也可以这样做:

for _ in myArray
{
    myArray.removeAtIndex(0)
}

2
这种解决方案效率极低-每次迭代时,所有后续对象的索引都会移动。另外,我不确定此实现是否安全。至少在Objective-C集合中,禁止枚举期间的突变。
Borys Verebskyi

0

用于从数组中删除所有数据

yourArrayData.removeAll()


0

根据您要完成的工作,Vadian的答案正确。代码示例所显示的问题是由于您尝试创建for循环的方式引起的。Index将默认从0开始。在它后面添加数字范围不是创建for循环的正确方法。这就是为什么您看到错误。而是,如下创建您的for循环:

for index in myArray.indices {
    // Do stuff
}

希望这个答案能对Swift或编程新手有所帮助。


迭代集合时,应使用array indexs属性。并非所有收藏品都从零索引开始
Leo Dabus

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.