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'


5
Sederhana. menginisialisasi ulang array ...
VJ

Jawaban:


326

Ada metode (sebenarnya fungsi)

myArray.removeAll()

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.


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)

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.


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).


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
}

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


0

Anda juga bisa melakukan ini:

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

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()


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.


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()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.