Swift: supprimer tous les éléments du tableau

108

J'essaie de supprimer tous les éléments du tableau avec une boucle for comme celle-ci:

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

Mais cela ne fonctionne pas, j'obtiens cette erreur avant le bulding:

Attendu ';' dans l'instruction 'for'

Mehmet
la source
5
Facile. réinitialiser le tableau ...
VJ

Réponses:

326

Il y a une méthode (en fait une fonction)

myArray.removeAll()
vadian
la source
1
Je ne savais pas à ce sujet, merci +1
JamesG
12
@NoodleOfDeath Les tableaux Swift strictement parlés sont des structs et les structs ont functionscontrairement aux classes qui ont methods.
vadian
1
@vadian +1 pour la clarification. J'ai oublié que Arrays sont structs. Codeur Objective-C vétéran ici ...
NoodleOfDeath
1
avez-vous besoin d'appeler la fonction removeAll () lorsque vous quittez une vue (viewcontroller) où vous l'initialisez, ou disparaît-elle d'elle-même !?
Famic Tech
1
@FamicTech Cela dépend: si la vue est déchargée, elle disparaît implicitement, si la vue ne fait que disparaître, vous devez appeler removeAll(). Cependant, il est bon (discipline de la mémoire) de supprimer toutes les données inutiles lorsqu'une vue disparaît.
vadian
17

En prenant pour acquis que la réponse de @ vadian est la solution , je voudrais juste souligner que votre code ne fonctionne pas.

Tout d'abord, les index de tableau sont basés sur 0, vous devez donc réécrire la plage en conséquence:

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

Cependant, cette implémentation va provoquer un crash. Si vous avez un tableau de 10 éléments, le dernier élément occupe la position à l'index 9.

En utilisant cette boucle, à la première itération, l'élément à l'index 0 est supprimé, ce qui provoque le décalage du dernier élément à l'index 8.

À l'itération suivante, l'élément à l'index 1 est supprimé et le dernier élément décale vers le bas à l'index 7. Et ainsi de suite.

À un moment donné de la boucle, une tentative de suppression d'un élément d'un index non existant provoquera le blocage de l'application.

Lors de la suppression d'éléments d'un tableau dans une boucle, la meilleure façon de le faire est de le parcourir dans l'ordre inverse:

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

Cela garantit que les éléments supprimés ne modifient pas l'ordre ou l'index des éléments à traiter.

Antonio
la source
1
Il existe une fonction pour supprimer tous les éléments en une seule ligne. as @ vadian's answer ...
VJ
3
@VJ c'est ce que j'ai écrit dans la première ligne de ma réponse :)
Antonio
+1 pour une solution qui peut être utilisée pour supprimer une instance particulière d'un objet. J'utilise de 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 } }préférence pas toutes une ligne mais ce code doit être compilé sur une seule ligne
NoodleOfDeath
Pourquoi pas for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? Je ne sais pas encore grand chose sur l'efficacité, mais de cette façon, vous n'avez pas besoin d'inverser la plage, alors peut-être que c'est plus rapide.
cbjeukendrup
Cela fonctionne aussi! Même méthode en termes d'efficacité, vous supprimez du début au lieu de la fin, mais vous enregistrez une variable :-)
Antonio
7

Il vous manque le inmot clé à l'origine de votre erreur. Le code doit être:

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

Cela ne fonctionnera cependant pas comme prévu pour plusieurs raisons:

  • Le dernier index valide est celui count - 1qui exigerait1..<myArray.count
  • Plus important encore, la suppression d'un élément d'un tableau le raccourcit, changeant ainsi les index à chaque fois.

Si vous essayez de supprimer toutes les choses du tableau, vous devez faire comme d'autres l'ont suggéré et utiliser:

myArray.removeAll()

Dans le cas où vous ne voulez que le premier élément et rien d'autre, vous pouvez obtenir une référence au premier objet, videz le tableau, puis rajoutez l'objet:

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)
Kyle Decot
la source
Désolé, je n'ai pas vu "in" ... Did +1
VJ
1
(+1) pour expliquer l'erreur réelle. (-1) car cela ne fonctionnera pas, car la suppression d'un élément rend le tableau plus court. (Notez également que le dernier index valide est count - 1).
Martin R
7

Si vous voulez vraiment effacer le tableau, le moyen le plus simple est de le réinitialiser.

VJ
la source
3

Votre code devrait fonctionner, il est juste hors des limites.

Swift 3

existingArray = []

En faisant cela, vous réaffectez un tableau vide au tableau existant et le type de données est référencé.

Vous pouvez également utiliser removeAllqui supprime tous les éléments du tableau et offre une option pour conserver la capacité existante.

existingArray.removeAll()

C'est une mutatingfonction qui signifie que le tableau appelant la méthode sera changé (vide).

Lorem
la source
2

Kyle est sur la bonne voie, mais son code échouera car les indices possibles diminuent lors de l'énumération, conduisant à des indices illégaux.

Une façon de le résoudre est d'énumérer à l'envers. En rapide, cela se fait en utilisant des foulées .

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

une autre option serait d'utiliser filter()

Swift 1.2

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

Swift 2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}
vikingosegundo
la source
Très intéressant! Je ne savais passtride
Kyle Decot
1

La méthode removeAllObjects () est disponible dans Swift 2

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

Pour supprimer un élément à un index particulier, utilisez:

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

Pour supprimer le dernier élément, utilisez:

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

Pour supprimer des éléments dans une plage particulière, utilisez:

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

Pour supprimer un élément particulier, utilisez:

Syntax : public func removeObject(anObject: AnyObject)

La capture d'écran ci-dessous montre la liste des méthodes disponibles dans l'extension NSMutableArray

Capture d'écran 1

Jayprakash Dubey
la source
0

Vous pouvez également faire ceci:

for _ in myArray
{
    myArray.removeAtIndex(0)
}
Darth Flyeater
la source
2
Cette solution est terriblement inefficace - à chaque itération, tous les index des objets suivants sont décalés. De plus, je ne suis pas sûr que cette implémentation soit sûre. Au moins dans les collections Objective-C, la mutation pendant le dénombrement est interdite.
Borys Verebskyi
0

Pour supprimer toutes les données d'un tableau

yourArrayData.removeAll()

Ronak
la source
0

Vadian a la bonne réponse en termes de ce que vous essayez d'accomplir. Le problème indiqué à la suite de votre exemple de code est dû à la façon dont vous essayez de créer la forboucle. Indexcommencera à 0 par défaut. L'ajout d'une plage de nombres après ce n'est pas la bonne façon de créer une boucle for. C'est pourquoi vous voyez l'erreur. Au lieu de cela, créez votre boucle for comme suit:

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

Espérons que cette réponse aidera les autres nouveaux utilisateurs de Swift ou de la programmation.

Josh Hrach
la source
vous devez utiliser la propriété array index pour lors de l'itération de la collection. Toutes les collections ne commencent pas à zéro index
Leo Dabus
0

Pour supprimer tous les éléments du tableau

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