web-dev-qa-db-fra.com

Supprimer un objet d'un tableau dans Swift 3

Dans mon application, j'ai utilisé tableview. J'ai ajouté un objet dans un tableau lorsque vous sélectionnez une cellule, puis désélectionnez et supprimez un objet lorsque vous sélectionnez à nouveau une cellule. J'ai utilisé ce code mais donnez-moi une erreur. Aidez-moi, s'il vous plaît

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        let cell = tableView.cellForRow(at: indexPath as IndexPath) as? ConctactsCell
        cell?.imgCheckMark.image = UIImage(named:"check_mark")
        arrContacts.append(contacts[indexPath.row] )
        NSLog("selected code = %@",arrContacts);
    }
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath as IndexPath) as? ConctactsCell
        cell?.imgCheckMark.image = UIImage(named:"")
        arrContacts.removeObject(contacts[indexPath.row])
        }

    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)
            }
        }
    }

Ça me donne 3 erreur comme ça 

Declaration is only valid at file scope
C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
52

Swift (3) équivalent à NSMutableArray 's 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'est pas du tout nécessaire de transtyper en NSArray et d'utiliser indexOfObject:

S'il existe plusieurs occurrences du même objet, utilisez filter. Toutefois, dans les cas tels que les tableaux de sources de données où un index est associé à un objet particulier, index(of est préférable car il est plus rapide que filter.

Mettre à jour:

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

array.removeAll{$0 == "beta"}
100
vadian
var a = ["one", "two", "three", "four", "five"]

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

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)
}
22
Mark Semsel

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) 
13
Luca Davanzo
  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)
    }
    
5
Tj3n

Dans Swift 3, utilisez cette Extension:

extension Array where Element: Equatable{
    mutating func remove (element: Element) {
        if let i = self.index(of: element) {
            self.remove(at: i)
        }
    }
}

exemple:

var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")
4
Mohsenasm

Swift 4

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]

if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
   students.remove(at: index)
}
4
Sergey Di

La solution correcte et efficace pour supprimer un objet unique (nommé "objectToRemove") d'un tableau de ces objets (nommé "array") dans Swift 3 est la suivante:

if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
   array.remove(at: index)
}
2
Joerg

Essayez ceci dans Swift 3

array.remove(at: Index)

Au lieu de

array.removeAtIndex(index)

Mettre à jour

"Declaration is only valid at file scope".

Assurez-vous que l'objet est dans la portée. Vous pouvez donner la portée "interne", qui est la valeur par défaut.

index(of:<Object>) pour fonctionner, la classe doit être conforme à Equatable 

1
Dili

Dans Swift 3 et 4

var array = ["a", "b", "c", "d", "e", "f"]

for (index, element) in array.enumerated().reversed() {
    array.remove(at: index)
}

De Swift 4.2 , vous pouvez utiliser une approche plus avancée (plus rapide et plus efficace en termes de mémoire)

array.removeAll(where: { $0 == "c" })

au lieu de

array = array.filter { !$0.hasPrefix("c") }

Lire la suite ici

0
yoAlex5

Extension pour array pour le faire facilement et permettre l'enchaînement:

public extension Array where Element: Equatable {
    @discardableResult
    public mutating func remove(_ item: Element) -> Array {
        if let index = firstIndex(where: { item == $0 }) {
            remove(at: index)
        }
        return self
    }

    @discardableResult
    public mutating func removeAll(_ item: Element) -> Array {
        removeAll(where: { item == $0 })
        return self
    }
}
0
Renetik

C'est la réponse officielle pour trouver l'index d'un objet spécifique, alors vous pouvez facilement supprimer n'importe quel objet utilisant cet index:

var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.firstIndex(of: "Maxime") {
     // students[i] = "Max"
     students.remove(at: i)
}
print(students)
// Prints ["Ben", "Ivy", "Jordell"]

Voici le lien: https://developer.Apple.com/documentation/Swift/array/2994720-firstindex

0
Mahesh Cheliya