Swift:すべての配列要素を削除します


108

次のようなforループですべての配列要素を削除しようとしています:

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

しかし、それは機能しません、私は構築する前にこのエラーを受け取ります:

「;」が必要です 「for」ステートメント内


5
シンプル。アレイを再初期化...
VJ

回答:


326

メソッドがあります(実際には関数)

myArray.removeAll()

1
これについては知りませんでした。ありがとう+1
JamesG 2016

11
@NoodleOfDeath厳密に話されるSwift配列はstructsであり、構造体はを持つfunctionsクラスとは異なりますmethods
バディアンの

1
明確化のために@vadian +1。Arraysがstructsであることを忘れました。ベテランObjective-Cコーダーはこちら...
NoodleOfDeath 2016

1
それを初期化するビュー(viewcontroller)を終了するときにremoveAll()関数を呼び出す必要がありますか、それとも自然に消えますか?
Famic Tech 2017

1
@FamicTech状況によって異なります。ビューがアンロードされると、暗黙的に消えますremoveAll()。ビューが消えるだけの場合は、を呼び出す必要があります。ただし、ビューが消えたときに不要なデータをすべて削除することをお勧めします(メモリ規則)。
バディアン

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
すべての要素を1行で削除する機能があります。@vadianの答えとして...
VJ

3
@VJそれは私が私の答えの最初の行で書いたものです:)
アントニオ

オブジェクトの特定のインスタンスを削除するために使用できるソリューションの+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 } }できればすべて1行ではなく使用しますが、そのコードは1行でコンパイルする必要があります
NoodleOfDeath

なんでfor _ in 0...<myArray.count { myArray.removeAtIndex(0) }?効率についてはまだあまり詳しくありませんが、この方法では範囲を逆にする必要がないため、おそらくより高速です。
cbjeukendrup

それも機能します!効率の点では同じ方法で、最後ではなく最初から削除しますが、変数を保存します:-)
Antonio

7

inエラーの原因となっているキーワードがありません。コードは次のようになります。

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

ただし、これは、いくつかの理由で期待どおりに機能しません。

  • 最後の有効なインデックスはcount - 11..<myArray.count
  • さらに重要なことに、配列から要素を削除すると、要素が短くなり、そのたびにインデックスが変更されます。

配列からすべてのものを削除しようとしている場合は、他の人が提案して使用しているようにしてください:

myArray.removeAll()

最初の要素だけが必要な場合は、最初のオブジェクトへの参照を取得し、配列を空にして、オブジェクトを追加し直すことができます。

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

申し訳ありませんが、 "in"は表示されませんでした... +1
VJ

1
(+1)実際のエラーを説明します。(-1)これは機能しません。アイテムを削除すると、配列が短くなるためです。(最後の有効なインデックスがであることにも注意してくださいcount - 1)。
マーティンR

7

本当にアレイをクリアしたい場合は、最も簡単な方法はそれを再初期化することです。


3

あなたのコードは動くはずです、それはちょうど範囲外です。

スウィフト3

existingArray = []

これにより、空の配列を既存の配列に再度割り当て、データ型が参照されます。

または、を使用removeAllして配列からすべての要素を削除し、既存の容量を維持するオプションを提供できます。

existingArray.removeAll()

これはmutating、メソッドを呼び出す配列が変更される(空になる)ことを意味する関数です。


2

カイルは正しい軌道に乗っていますが、列挙中に可能なインデックスが減少し、違法なインデックスにつながるため、彼のコードは失敗します。

これを解決する1つの方法は、逆方向に列挙することです。迅速にこれはストライドを使用して行われます。

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

別のオプションは使用することです filter()

Swift 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 2016年

0

配列からすべてのデータを削除するため

yourArrayData.removeAll()


0

ヴァディアンはあなたが達成しようとしていることに関して正しい答えを持っています。コードサンプルの結果として示された問題は、forループを作成しようとしている方法が原因です。Indexデフォルトでは0から始まります。forループを作成する正しい方法ではない後に数値範囲を追加する。そのため、エラーが表示されます。代わりに、次のようにforループを作成します。

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

うまくいけば、この回答がSwiftやプログラミングに不慣れな他の人を助けることでしょう。


コレクションを反復するときは、配列インデックスプロパティを使用する必要があります。すべてのコレクションがゼロインデックスで始まるわけではありません
Leo Dabus

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.