Swift: tüm dizi öğelerini sil


108

For döngüsü olan tüm dizi öğelerini şöyle silmeye çalışıyorum:

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

Ama işe yaramıyor, bu hatayı bulmadan önce alıyorum:

Beklenen ';' 'for' ifadesinde


5
Basit. diziyi yeniden
VJ

Yanıtlar:


326

Bir yöntem var (aslında bir işlev)

myArray.removeAll()

1
Bunu bilmiyordum, Teşekkürler +1
JamesG

12
@NoodleOfDeath Kesinlikle konuşulan Swift dizileri dizilerdir structve yapıların sahip oldukları functionssınıflara benzemeyenler vardır methods.
vadian

1
Açıklama için @vadian +1. Unutmuşum Arrayler vardır structler. Veteran Objective-C kodlayıcı burada ...
NoodleOfDeath

1
onu başlattığınız bir görünümden (viewcontroller) çıkarken removeAll () işlevini çağırmanız gerekir mi, yoksa kendi kendine mi kaybolur?
Famic Tech

1
@FamicTech Şuna bağlıdır: Görünüm kaldırılırsa örtük olarak kaybolur, eğer görünüm sadece kaybolursa aramanız gerekir removeAll(). Ancak, bir görünüm kaybolduğunda tüm gereksiz verileri kaldırmak iyi bir (hafıza disiplini) uygulamadır.
vadian

17

@ Vadian'ın cevabının çözüm olduğunu varsayarsak , kodunuzun çalışmadığını belirtmek isterim.

Her şeyden önce, dizi dizinleri 0 tabanlıdır, bu nedenle aralığı uygun şekilde yeniden yazmalısınız:

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

Ancak bu uygulama bir çökmeye neden olacak. 10 öğeden oluşan bir diziniz varsa, son öğe dizin 9'daki konumu kaplar.

Bu döngüyü kullanarak, ilk yinelemede dizin 0'daki öğe kaldırılır ve bu, son öğenin dizin 8'de aşağı kaymasına neden olur.

Bir sonraki yinelemede, dizin 1'deki öğe kaldırılır ve son öğe, dizin 7'de aşağı kayar. Ve bu böyle devam eder.

Döngünün bir noktasında, mevcut olmayan bir dizine ait bir öğeyi kaldırma girişimi uygulamanın çökmesine neden olur.

Bir döngüdeki bir diziden öğeleri kaldırırken, bunu yapmanın en iyi yolu onu ters sırayla gezmektir:

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

Bu, kaldırılan öğelerin, işlenecek öğelerin sırasını veya dizinini değiştirmemesini sağlar.


1
Tüm unsurları tek satırda kaldırmak için bir fonksiyon var. @ vadian'ın yanıtı olarak ...
VJ

3
Ben :) cevabım ilk satırında yazmış ne @VJ
Antonio

Bir nesnenin belirli bir örneğini kaldırmak için kullanılabilen bir çözüm için +1. Kullandığım 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 } }tercihen hepsi değil bir satır ama bu kod tek satırda derlemek gerekir
NoodleOfDeath

Neden olmasın for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? Henüz verimlilik hakkında pek bir şey bilmiyorum, ancak bu şekilde aralığı tersine çevirmenize gerek yok, bu yüzden belki daha hızlıdır.
cbjeukendrup

Bu da çalışıyor! Verimlilik açısından aynı yöntem, son yerine baştan çıkarırsınız, ancak bir değişkeni kaydedersiniz :-)
Antonio

7

Hatanıza inneden olan anahtar kelimeyi kaçırıyorsunuz . Kod şu şekilde olmalıdır:

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

Ancak bu, birkaç nedenden dolayı beklediğiniz gibi çalışmayacaktır:

  • Son geçerli endeksidir count - 1gerektirecek1..<myArray.count
  • Daha da önemlisi, bir diziden bir öğeyi kaldırmak onu kısaltır, böylece her seferinde dizinleri değiştirir.

Diziden her şeyi kaldırmaya çalışıyorsanız, diğerlerinin önerdiği gibi yapmalı ve kullanmalısınız:

myArray.removeAll()

Yalnızca ilk öğeyi istemeniz ve başka hiçbir şey istememeniz durumunda, ilk nesneye bir başvuru alamazsınız, diziyi boşaltın ve ardından nesneyi tekrar ekleyin:

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

Üzgünüm "içinde" görmedim ... +1
VJ

1
(+1) gerçek hatayı açıklamak için. (-1) çünkü bu çalışmaz, çünkü bir öğeyi silmek diziyi kısaltır. ( Son geçerli dizinin olduğunu da unutmayın count - 1).
Martin R.

7

Diziyi gerçekten temizlemek istiyorsanız, en basit yol onu Yeniden Başlatmaktır.


3

Kodunuz çalışmalı, sınırın dışında.

Hızlı 3

existingArray = []

Bunu yaparak, mevcut diziye boş bir diziyi yeniden atarsınız ve veri türü başvurulur.

Alternatif olarak, removeAlldizideki tüm öğeleri kaldıran ve mevcut kapasiteyi korumak için bir seçenek sunan seçeneğini kullanabilirsiniz.

existingArray.removeAll()

Bu, mutatingyöntemi çağıran dizinin değiştirileceği (boş) anlamına gelen bir işlevdir.


2

Kyle doğru yoldadır, ancak numaralandırma sırasında olası endeksler azaldığından kodu başarısız olacak ve yasa dışı endekslere yol açacaktır.

Bunu çözmenin bir yolu geriye doğru numaralandırmaktır. Hızlı bir şekilde bu adımlarla yapılır .

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

başka bir seçenek kullanmak olabilir filter()

Swift 1.2

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

Swift 2

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

Çok ilginç! Bunu bilmiyordumstride
Kyle Decot

1

Orada removeAllObjects () Swift 2 uygun bir yöntem

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

Belirli bir dizindeki öğeyi kaldırmak için şunu kullanın:

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

Son element kullanımını kaldırmak için:

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

Belirli aralıktaki öğeleri kaldırmak için şunları kullanın:

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

Belirli element kullanımını kaldırmak için:

Syntax : public func removeObject(anObject: AnyObject)

Aşağıdaki ekran görüntüsü NSMutableArray uzantısında bulunan yöntemlerin listesini gösterir

Ekran görüntüsü 1


0

Bunu da yapabilirsiniz:

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

2
Bu çözüm son derece verimsizdir - her yinelemede sonraki tüm nesnelerin indeksi kaydırılır. Ayrıca, bu uygulamanın güvenli olup olmadığından emin değilim. En azından Objective-C koleksiyonlarında sayım sırasında mutasyon yasaktır.
Borys Verebskyi

0

Bir diziden tüm verileri kaldırmak için

yourArrayData.removeAll()


0

Vadian, başarmaya çalıştığınız şey açısından doğru cevaba sahip. Kod örneğinizin bir sonucu olarak gösterilen sorun, fordöngüyü oluşturmaya çalışma şeklinizden kaynaklanmaktadır . Indexvarsayılan olarak 0'dan başlayacaktır. Bir for döngüsü oluşturmanın doğru yolu bundan sonra bir sayı aralığı eklemek değildir. Bu yüzden hatayı görüyorsunuz. Bunun yerine, for döngüsünüzü aşağıdaki gibi oluşturun:

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

Umarım bu cevap Swift'e veya programlamaya yeni başlayanlara yardımcı olur.


koleksiyonu yinelerken dizi indeksleri özelliğini kullanmalısınız. Tüm koleksiyonlar sıfır endeksinden
başlamıyor

0

Dizinin Tüm Öğelerini Kaldırmak İçin

var array = [1,2,3,4,5,6]()
array.removeAll()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.