Swift: hapus semua elemen array

108

Saya mencoba untuk menghapus semua elemen array dengan for loop seperti ini:

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

Tetapi tidak berhasil, saya mendapatkan kesalahan ini sebelum bulding:

Diharapkan ';' dalam pernyataan 'untuk'

Mehmet
sumber
5
Sederhana. menginisialisasi ulang array ...
VJ

Jawaban:

326

Ada metode (sebenarnya fungsi)

myArray.removeAll()
vadian
sumber
1
Tidak tahu tentang ini, Terima kasih +1
JamesG
11
@NoodleOfDeath Larik Swift yang diucapkan dengan tegas adalah structs dan struct memiliki functionskelas yang tidak sama methods.
vadian
1
@vadian +1 untuk klarifikasi. Aku lupa Arrays are structs. Veteran Objective-C coder di sini ...
NoodleOfDeath
1
apakah Anda perlu memanggil fungsi removeAll () saat keluar dari tampilan (viewcontroller) tempat Anda menginisialisasinya, atau apakah fungsinya hilang dengan sendirinya !?
Famic Tech
1
@FamicTech Itu tergantung: Jika tampilan dibongkar itu hilang secara implisit, jika tampilan hanya menghilang Anda harus memanggil removeAll(). Namun, praktik yang baik (disiplin memori) untuk menghapus semua data yang tidak perlu saat tampilan menghilang.
vadian
17

Menerima begitu saja bahwa jawaban @ vadian adalah solusinya , saya hanya ingin menunjukkan bahwa kode Anda tidak berfungsi.

Pertama-tama, indeks array berbasis 0, jadi Anda harus menulis ulang rentangnya sesuai:

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

Namun implementasi ini akan menyebabkan crash. Jika Anda memiliki array 10 elemen, elemen terakhir menempati posisi di indeks 9.

Dengan menggunakan loop tersebut, pada iterasi pertama elemen pada indeks 0 dihapus, dan itu menyebabkan elemen terakhir bergeser ke bawah pada indeks 8.

Pada iterasi berikutnya, elemen pada indeks 1 dihilangkan, dan elemen terakhir bergeser ke bawah pada indeks 7. Dan seterusnya.

Di beberapa titik dalam loop, upaya untuk menghapus elemen untuk indeks yang tidak ada akan menyebabkan aplikasi mogok.

Saat menghapus elemen dari larik dalam satu putaran, cara terbaik untuk melakukannya adalah dengan membukanya dalam urutan terbalik:

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

Itu memastikan bahwa elemen yang dihapus tidak mengubah urutan atau indeks elemen yang masih akan diproses.

Antonio
sumber
1
Ada fungsi untuk menghapus semua elemen hanya dalam satu baris. sebagai jawaban @ vadian ...
VJ
3
@VJ itulah yang saya tulis di baris pertama jawaban saya :)
Antonio
+1 untuk solusi yang dapat digunakan untuk menghapus contoh tertentu dari suatu objek. Saya 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 } }sebaiknya menggunakan tidak semua satu baris tetapi kode itu harus dikompilasi dalam satu baris
NoodleOfDeath
Mengapa tidak for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? Saya belum tahu banyak tentang efisiensi, tetapi dengan cara ini Anda tidak perlu membalikkan kisaran, jadi mungkin ini lebih cepat.
cbjeukendrup
Itu juga berhasil! Metode yang sama dalam hal efisiensi, Anda menghapus dari awal, bukan dari akhir, tetapi Anda menyimpan variabel :-)
Antonio
7

Anda kehilangan inkata kunci yang menyebabkan kesalahan Anda. Kode tersebut harus:

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

Namun ini tidak akan berfungsi seperti yang Anda harapkan karena beberapa alasan:

  • Indeks valid terakhir adalah count - 1yang dibutuhkan1..<myArray.count
  • Lebih penting lagi, menghapus elemen dari array akan memperpendeknya sehingga mengubah indeks setiap saat.

Jika Anda mencoba untuk menghapus semua hal dari array maka Anda harus melakukan seperti yang disarankan dan digunakan orang lain:

myArray.removeAll()

Jika Anda hanya menginginkan elemen pertama dan tidak ada lagi yang bisa Anda dapatkan referensi ke objek pertama, kosongkan array, lalu tambahkan objek kembali:

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)
Kyle Decot
sumber
Maaf saya tidak melihat "dalam" ... Melakukan +1
VJ
1
(+1) untuk menjelaskan kesalahan sebenarnya. (-1) karena ini tidak akan berfungsi, karena menghapus item membuat array lebih pendek. (Perhatikan juga bahwa indeks valid terakhir adalah count - 1).
Martin R
7

Jika Anda benar-benar ingin menghapus array, cara termudah adalah dengan Melakukan Inisialisasi Ulang.

VJ
sumber
3

Kode Anda harus berfungsi, itu hanya di luar batas.

Cepat 3

existingArray = []

Dengan melakukan ini, Anda menetapkan kembali array kosong ke array yang ada dan tipe data dirujuk.

Alternatifnya, Anda dapat menggunakan removeAllyang menghapus semua elemen dari larik dan memberikan opsi untuk mempertahankan kapasitas yang ada.

existingArray.removeAll()

Ini adalah mutatingfungsi yang berarti array yang memanggil metode akan diubah (kosong).

Lorem
sumber
2

Kyle berada di jalur yang benar, tetapi kodenya akan gagal karena kemungkinan indeks berkurang selama pencacahan, yang mengarah ke indeks ilegal.

Salah satu cara untuk mengatasinya adalah dengan menghitung mundur. Dengan cepat ini dilakukan dengan menggunakan langkah .

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

pilihan lain akan digunakan filter()

Swift 1.2.0

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

Cepat 2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}
vikingosegundo.dll
sumber
Sangat menarik! Saya tidak tahu tentangstride
Kyle Decot
1

Ada metode removeAllObjects () yang tersedia di Swift 2

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

Untuk menghapus elemen pada penggunaan indeks tertentu:

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

Untuk menghapus penggunaan elemen terakhir:

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

Untuk menghapus elemen dalam penggunaan rentang tertentu:

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

Untuk menghapus penggunaan elemen tertentu:

Syntax : public func removeObject(anObject: AnyObject)

Tangkapan layar di bawah ini menunjukkan daftar metode yang tersedia di ekstensi NSMutableArray

Tangkapan layar 1

Jayprakash Dubey
sumber
0

Anda juga bisa melakukan ini:

for _ in myArray
{
    myArray.removeAtIndex(0)
}
Darth Flyeater
sumber
2
Solusi ini sangat tidak efisien - pada setiap iterasi semua indeks objek berikutnya digeser. Selain itu, saya tidak yakin apakah penerapan ini aman. Setidaknya dalam koleksi Objective-C mutasi selama pencacahan dilarang.
Borys Verebskyi
0

Untuk menghapus semua data dari array

yourArrayData.removeAll()

Ronak
sumber
0

Vadian memiliki jawaban yang benar dalam hal apa yang ingin Anda capai. Masalah yang ditampilkan sebagai hasil dari sampel kode Anda disebabkan oleh cara Anda mencoba membuat forloop. Indexakan mulai dari 0 secara default. Menambahkan rentang angka setelah itu bukanlah cara yang benar untuk membuat perulangan for. Itulah mengapa Anda melihat kesalahan tersebut. Sebagai gantinya, buat loop for Anda sebagai berikut:

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

Semoga jawaban ini akan membantu orang lain yang baru mengenal Swift atau pemrograman.

Josh Hrach
sumber
Anda harus menggunakan properti indeks larik ketika mengulang koleksi. Tidak semua koleksi dimulai pada indeks nol
Leo Dabus
0

Untuk Menghapus Semua Elemen Array

var array = [1,2,3,4,5,6]()
array.removeAll()
Imran Rasheed
sumber