Comment puis-je désactiver / supprimer un élément d’un tableau dans la nouvelle langue d’Apple, Swift?
Voici un code:
let animals = ["cats", "dogs", "chimps", "moose"]
Comment les éléments animals[2]
pourraient-ils être retirés du tableau?
Le mot let
clé let
est utilisé pour déclarer des constantes qui ne peuvent pas être modifiées. Si vous voulez modifier une variable, utilisez plutôt var
, par exemple:
var animals = ["cats", "dogs", "chimps", "moose"] animals.remove(at: 2) //["cats", "dogs", "moose"]
Une alternative non mutante qui gardera la collection d’origine inchangée consiste à utiliser filter
pour créer une nouvelle collection sans les éléments que vous souhaitez supprimer, par exemple:
let pets = animals.filter { $0 != "chimps" }
Les réponses ci-dessus semblent présumer que vous connaissez l’index de l’élément que vous souhaitez supprimer.
Vous connaissez souvent la référence à l’object que vous souhaitez supprimer dans le tableau. (Vous avez parcouru votre tableau et l’avez trouvé, par exemple) Dans de tels cas, il peut être plus facile de travailler directement avec la référence d’object sans avoir à passer partout son index. Par conséquent, je suggère cette solution. Il utilise l’ opérateur d’identité !==
, que vous utilisez pour tester si deux références d’object se réfèrent toutes deux à la même instance d’object.
func delete(element: Ssortingng) { list = list.filter() { $0 !== element } }
Bien sûr, cela ne fonctionne pas uniquement pour les Ssortingng
.
Donné
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeFirst() // "cats" print(animals) // ["dogs", "chimps", "moose"]
animals.removeLast() // "moose" print(animals) // ["cats", "dogs", "chimps"]
animals.remove(at: 2) // "chimps" print(animals) // ["cats", "dogs", "moose"]
Pour un seul élément
if let index = animals.index(of: "chimps") { animals.remove(at: index) } print(animals) // ["cats", "dogs", "moose"]
Pour plusieurs éléments
var animals = ["cats", "dogs", "chimps", "moose", "chimps"] animals = animals.filter(){$0 != "chimps"} print(animals) // ["cats", "dogs", "moose"]
Ou bien
animals.index(of: "chimps").map { animals.remove(at: $0) }
filter
) et renvoient l’élément qui a été supprimé. dropFirst
ou dropLast
pour créer un nouveau tableau. Mis à jour pour Swift 3
Vous pourriez faire ça. Assurez-vous d’abord que Dog
existe vraiment dans le tableau, puis retirez-le. Ajoutez le for
si vous croyez que Dog
peut se produire plus d’une fois sur votre tableau.
var animals = ["Dog", "Cat", "Mouse", "Dog"] let animalToRemove = "Dog" for object in animals { if object == animalToRemove{ animals.removeAtIndex(animals.indexOf(animalToRemove)!) } }
Si vous êtes certain que Dog
sort dans le tableau et qu’il ne s’est produit qu’une seule fois, faites-le:
animals.removeAtIndex(animals.indexOf(animalToRemove)!)
Si vous avez les deux, les chaînes et les nombres
var array = [12, 23, "Dog", 78, 23] let numberToRemove = 23 let animalToRemove = "Dog" for object in array { if object is Int { // this will deal with integer. You can change to Float, Bool, etc... if object == numberToRemove { array.removeAtIndex(array.indexOf(numberToRemove)!) } } if object is Ssortingng { // this will deal with ssortingngs if object == animalToRemove { array.removeAtIndex(array.indexOf(animalToRemove)!) } } }
Peu d’opérations concernent Array in Swift
Créer un tableau
var ssortingngArray = ["One", "Two", "Three", "Four"]
Ajouter un object dans un tableau
ssortingngArray = ssortingngArray + ["Five"]
Obtenir la valeur de l’object Index
let x = ssortingngArray[1]
Ajouter un object
ssortingngArray.append("At last position")
Insérer un object à l’index
ssortingngArray.insert("Going", atIndex: 1)
Supprimer un object
ssortingngArray.removeAtIndex(3)
Valeur de l’object Concat
var ssortingng = "Concate Two object of Array \(ssortingngArray[1]) + \(ssortingngArray[2])"
Swift 3: Voici une extension simple et cool pour supprimer des éléments dans un tableau, sans filtrage:
extension Array where Element: Equatable { // Remove first collection element that is equal to the given `object`: mutating func remove(object: Element) { if let index = index(of: object) { remove(at: index) } } }
Utilisation:
var myArray = ["cat", "barbecue", "pancake", "frog"] let objectToRemove = "cat" myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]
Si vous ne connaissez pas l’index de l’élément que vous souhaitez supprimer, et que l’élément est conforme au protocole Equatable, vous pouvez le faire:
animals.removeAtIndex(animals.indexOf("dogs")!)
Voir la réponse du protocole Equatable: Comment faire un indexOfObject ou un containsObject approprié
Pour Swift4:
list = list.filter{$0 != "your Value"}
Supprimer des éléments à l’aide du tableau index:
Tableau de chaînes et d’index
let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"] let indexAnimals = [0, 3, 4] let arrayRemainingAnimals = animals .enumerated() .filter { !indexAnimals.contains($0.offset) } .map { $0.element } print(arrayRemainingAnimals) //result - ["dogs", "chimps", "cow"]
Tableau d’entiers et d’index
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] let indexesToRemove = [3, 5, 8, 12] numbers = numbers .enumerated() .filter { !indexesToRemove.contains($0.offset) } .map { $0.element } print(numbers) //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
Supprimer des éléments en utilisant la valeur d’élément d’un autre tableau
Tableaux d’entiers
let arrayResult = numbers.filter { element in return !indexesToRemove.contains(element) } print(arrayResult) //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
Tableaux de chaînes
let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] let arrayRemoveLetters = ["a", "e", "g", "h"] let arrayRemainingLetters = arrayLetters.filter { !arrayRemoveLetters.contains($0) } print(arrayRemainingLetters) //result - ["b", "c", "d", "f", "i"]
En ce qui concerne l’alternative de @ Suragch à “Supprimer l’élément de l’index inconnu”:
Il existe une version plus puissante de “indexOf (element)” qui correspond à un prédicat plutôt qu’à l’object lui-même. Il porte le même nom mais il s’appelle myObjects.indexOf {$ 0.property = valueToMatch}. Il renvoie l’index du premier élément correspondant trouvé dans le tableau myObjects.
Si l’élément est un object / struct, vous pouvez vouloir supprimer cet élément en fonction d’une valeur de l’une de ses propriétés. Par exemple, vous avez une propriété Car ayant la propriété car.color, et vous souhaitez supprimer la voiture “rouge” de votre voiture.
if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) { carsArray.removeAtIndex(validIndex) }
Vous pouvez sans doute retravailler ceci pour supprimer “tous” les wagons rouges en intégrant la déclaration if ci-dessus dans une boucle repeat / while et en attachant un bloc else pour définir un flag “break” de la boucle.
A partir de Xcode 10+, et conformément à la session WWDC 2018 223, “Embracing Algorithms”, une bonne méthode pour avancer sera la mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
L’exemple d’Apple:
var phrase = "The rain in Spain stays mainly in the plain." let vowels: Set = ["a", "e", "i", "o", "u"] phrase.removeAll(where: { vowels.contains($0) }) // phrase == "Th rn n Spn stys mnly n th pln."
voir la documentation d’Apple
Donc, dans l’exemple de l’OP, enlever des animaux [2], “chimpanzés”:
var animals = ["cats", "dogs", "chimps", "moose"] animals.removeAll(where: { $0 == "chimps" } ) // or animals.removeAll { $0 == "chimps" }
Cette méthode peut être préférée car elle évolue bien (linéaire vs quadratique), est lisible et propre. Gardez à l’esprit que cela ne fonctionne que dans Xcode 10+, et en écriture, c’est en bêta.
Cela devrait le faire (non testé):
animals[2..3] = []
Edit: et vous devez en faire un var
, pas un let
, sinon c’est une constante immuable.
Je suis venu avec l’extension suivante qui prend soin de supprimer des éléments d’un Array
, en supposant que les éléments dans l’outil Array
Equatable
:
extension Array where Element: Equatable { mutating func removeEqualItems(item: Element) { self = self.filter { (currentItem: Element) -> Bool in return currentItem != item } } mutating func removeFirstEqualItem(item: Element) { guard var currentItem = self.first else { return } var index = 0 while currentItem != item { index += 1 currentItem = self[index] } self.removeAtIndex(index) } }
var test1 = [1, 2, 1, 2] test1.removeEqualItems(2) // [1, 1] var test2 = [1, 2, 1, 2] test2.removeFirstEqualItem(2) // [1, 1, 2]
Si vous avez un tableau d’objects personnalisés, vous pouvez effectuer une recherche par propriété spécifique, comme ceci:
if let index = doctorsInArea.indexOf({$0.id == doctor.id}){ doctorsInArea.removeAtIndex(index) }
ou si vous voulez rechercher par nom par exemple
if let index = doctorsInArea.indexOf({$0.name == doctor.name}){ doctorsInArea.removeAtIndex(index) }
extension pour supprimer l’object Ssortingng
extension Array { mutating func delete(element: Ssortingng) { self = self.filter() { $0 as! Ssortingng != element } } }
J’utilise cette extension, presque identique à celle de Varun, mais celle-ci (ci-dessous) est polyvalente:
extension Array where Element: Equatable { mutating func delete(element: Iterator.Element) { self = self.filter{$0 != element } } }
var indexForDelete = 0 let yourArray = [Ssortingng]() let newArray = [Ssortingng]() for obj in yourArray { if conduction == true{ newArray.append(obj) //all object which is you want to add in second array (newArray) }else{ //all remaining object which is you want to delete from yourArray } }
// maintenant votre newArray est filtré