108 votes

Supprimer un objet d'un tableau dans Swift 3

Dans mon application, j'ai ajouté un objet dans un tableau lors de la sélection d'une cellule, puis désélectionné et supprimé un objet lors de la nouvelle sélection d'une cellule. J'ai utilisé ce code mais donnez-moi une erreur.

 extension Array {
    func indexOfObject(object : AnyObject) -> NSInteger {
        return (self as NSArray).indexOfObject(object)
    }

    mutating func removeObject(object : AnyObject) {
        for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) {
            self.removeAtIndex(index)
        }
    }
}

class MyViewController: UITableViewController {
    var arrContacts: [Any] = []
    var contacts: [Any] = []

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        arrContacts.removeObject(contacts[indexPath.row])
    }
}
 

Cela me donne 2 erreur comme ça:

 C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
 

195voto

vadian Points 29149

La Swift (3) équivalent à NSMutableArrays' removeObject est:

var array = ["alpha", "beta", "gamma"]

if let index = array.index(of:"beta") {
    array.remove(at: index)
}

si les objets sont uniques. Il n'y a pas besoin de cast NSArray et l'utilisation indexOfObject:

S'il y a plusieurs occurrences d'un même objet utiliser filter. Toutefois, dans des cas comme source de données tableaux où un index est associé à un objet particulier index(of est préférable car il est plus rapide que d' filter.

Mise à jour:

Dans Swift 4.2+, vous pouvez supprimer un ou plusieurs occurrences de beta avec removeAll:

array.removeAll{$0 == "beta"}

75voto

nyxee Points 1328
var a = ["one", "two", "three", "four", "five"]

// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }

26voto

Mark Semsel Points 813

Pour Swift 3, vous pouvez utiliser index (où :) et inclure une fermeture permettant de comparer un objet du tableau ($ 0) à celui que vous recherchiez.

 var array = ["alpha", "beta", "gamma"]
if let index = array.index(where: {$0 == "beta"}) {
  array.remove(at: index)
}
 

17voto

Velthune Points 3019

Une autre solution intéressante et utile consiste à créer ce type d’extension:

 extension Array where Element: Equatable {

    @discardableResult mutating func remove(object: Element) -> Bool {
        if let index = index(of: object) {
            self.remove(at: index)
            return true
        }
        return false
    }

    @discardableResult mutating func remove(where predicate: (Array.Iterator.Element) -> Bool) -> Bool {
        if let index = self.index(where: { (element) -> Bool in
            return predicate(element)
        }) {
            self.remove(at: index)
            return true
        }
        return false
    }

}
 

De cette façon, si vous avez votre tableau avec des objets personnalisés:

 let obj1 = MyObject(id: 1)
let obj2 = MyObject(id: 2)
var array: [MyObject] = [obj1, obj2]

array.remove(where: { (obj) -> Bool in
    return obj.id == 1
})
// OR
array.remove(object: obj2) 
 

6voto

Tj3n Points 6697
  1. for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) est pour la boucle dans le style C et a été supprimé

  2. Changez votre code en quelque chose comme ceci pour supprimer tous les objets similaires s'il a été mis en boucle

     let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset }
    for index in indexes.reversed() {
       arrContacts.remove(at: index)
    }
     

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X