web-dev-qa-db-fra.com

Comment supprimer un élément d'une valeur donnée d'un tableau dans Swift

Je veux supprimer tous les éléments de valeur x d'un tableau contenant des éléments x, y et z

let arr = ['a', 'b', 'c', 'b']

Comment puis-je supprimer tous les éléments de valeur 'b' de arr?

36
Encore PTL

Un filtre:

 let farray = arr.filter {$0 != "b"} 
98
iluvcapra
var array : [String]
array = ["one","two","one"]

let itemToRemove = "one"

while array.contains(itemToRemove) {
    if let itemToRemoveIndex = array.index(of: itemToRemove) {
        array.remove(at: itemToRemoveIndex)
    }
}

print(array)

Fonctionne sur Swift 3.0.

12
Nitrousjp

ÉDITÉselon les commentaires: 

J'aime cette approche: 

var arr = ["a", "b", "c", "b"]

while let idx = arr.index(of:"b") {
    arr.remove(at: idx)
}

Réponse originale (avant édition):

let arr = ['a', 'b', 'c', 'b']

if let idx = arr.index(of:"b") {
    arr.remove(at: idx)
}
4
Jens

Dans Swift 3 je fais simplement:

arr = arr.filter { $0 != "a" } 

Les filtres .filter, .sort et .map permettent de gagner du temps et de résoudre de nombreux problèmes avec peu de code.

Cet article contient de bons exemples et explique les différences et leur fonctionnement: https://useyourloaf.com/blog/Swift-guide-to-map-filter-reduce/

2

Une approche générale consiste à exploiter des procédures de première classe. (Cependant, cette approche est beaucoup plus puissante que ce qui est requis pour votre question.) Pour illustrer, disons que vous voulez éviter "Justin" à plusieurs reprises dans de nombreuses collections.

let avoidJustin = notEqualTester ("Justin")

let arrayOfUsers = // ...

arrayOfUsers.filter (avoidJustin)

let arrayOfFriends = // ...

arrayOfFriends.filter (avoidJustin)

Avec cela, vous évitez de créer à plusieurs reprises une fermeture chaque fois que vous voulez éviter Justin. Voici notEqualTester qui, étant donné une that, retourne une fonction de this qui renvoie this != that.

func notEqualTester<T: Equatable> (that:T) -> ((this:T) -> Bool) {
  return { (this:T) -> Bool in return this != that }
}

La fermeture renvoyée pour thiscaptures la valeur pour that - qui peut être utile lorsque that n'est plus disponible.

1
GoZoner

Si vous devez modifier le tableau initial, vous pouvez utiliser la fonction removeAll(where:) disponible dans Swift 4.2/Xcode 10:

var arr = ["a", "b", "c", "b"]
arr.removeAll(where: { $0 == "b" })
print(arr) // output is ["a", "c"]

Cependant, si vous utilisez Xcode 9, vous pouvez trouver cette fonction dans Xcode9to10Preparation (cette bibliothèque fournit des implémentations de nouvelles fonctions de Xcode 10).

0
Roman Podymov