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?
Un filtre:
let farray = arr.filter {$0 != "b"}
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.
É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)
}
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/
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 this
captures la valeur pour that
- qui peut être utile lorsque that
n'est plus disponible.
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).