Enlever un élément d'un tableau en Swift

Bonjour,

J'ai le code suivant:

class toto
{
}

var tableau:[toto] = []

let test = toto()

tableau.append(test)

// maintenant je veux enlever l’élément 'test' du tableau

let index = tableau.index{$0 === test}

tableau.remove(at: index!)

Il n'y a pas une méthode pour simplifier du genre tableau.remove(test) avec une extension ou autre ?

Merci

Réponses

  • LarmeLarme Membre

    En Swift 4.2, il y a un remove(where:) bien pratique.
    Mais entre temps, non, à moins d'utiliser un filter() (mais ça retourne un tableau sans la valeur).

    Tu peux mimer le remove(where:) en créant un extension cependant.

  • PyrohPyroh Membre
    14 sept. modifié #3

    Il faut que la classe toto se conforme au protocol Equatable.
    J'ai lu en diagonale. Oubliez ça.

  • LarmeLarme Membre

    Sans utiliser de génériques (et pas vraiment fully tested, et le mettre sur Sequence peut-être plutôt qu'Array uniquement), mais clairement à s'rait à faire et ça doit se sûrement déjà se trouver sur le net :

    extension Array {
        mutating func removeAll2(where condition: ((Any) -> (Bool))) {
            while let indices = self.firstIndex(where: { condition($0) }) {
                self.remove(at: indices)
            }
        }
    }
    

    Tu peux virer le while et le remplacer par un if si tu veut un removeFirst(where:), etc.

  • DrakenDraken Membre

    @Larme a dit :
    En Swift 4.2, il y a un remove(where:) bien pratique.
    Mais entre temps, non, à moins d'utiliser un filter()...

    De toute manière, Swift 4.2 sera disponible avant la fin du mois avec la version officielle d'XCode 10.

  • Merci a tous pour ces informations

  • Joanna CarterJoanna Carter Membre, Modérateur
    14 sept. modifié #7

    @devulder a dit :
    // maintenant je veux enlever l’élément 'test' du tableau

    let index = tableau.index{$0 === test}

    Si tu veux utiliser === pour comparer l'élément à enlever (en indiquant que tu ne mets que les classes dans la liste), tu peux créer un extension comme ci :

    extension Array where Element : AnyObject
    {
      mutating func remove<itemT : AnyObject>(item: itemT)
      {
        if let index = index(where: { $0 === item} )
        {
          let _ = self.remove(at: index)
        }
      }
    }
    

    Si tu veux utiliser la meme chose pour n'importe quel type (au moins Equatable), tu peux faire :

    extension Array where Element : Equatable
    {
      mutating func remove(item: Element)
      {
        if let index = index(where: { $0 == item})
        {
          let _ = self.remove(at: index)
        }
      }
    }
    

    Et, pour les classes, il faut ajouter :

    extension MaClasse : Equatable
    {
      static func == (lhs: Test, rhs: Test) -> Bool
      {
        return lhs === rhs
      }
    }
    
  • @Joanna Carter a dit :

    @devulder a dit :
    // maintenant je veux enlever l’élément 'test' du tableau

    let index = tableau.index{$0 === test}

    Si tu veux utiliser === pour comparer l'élément à enlever (en indiquant que tu ne mets que les classes dans la liste), tu peux créer un extension comme ci :

    extension Array where Element : AnyObject
    {
      mutating func remove<itemT : AnyObject>(item: itemT)
      {
        if let index = index(where: { $0 === item} )
        {
          let _ = self.remove(at: index)
        }
      }
    }
    

    Si tu veux utiliser la meme chose pour n'importe quel type (au moins Equatable), tu peux faire :

    extension Array where Element : Equatable
    {
      mutating func remove(item: Element)
      {
        if let index = index(where: { $0 == item})
        {
          let _ = self.remove(at: index)
        }
      }
    }
    

    Et, pour les classes, il faut ajouter :

    extension MaClasse : Equatable
    {
      static func == (lhs: Test, rhs: Test) -> Bool
      {
        return lhs === rhs
      }
    }
    

    Merci!

  • DrakenDraken Membre

    @Draken a dit :

    @Larme a dit :
    En Swift 4.2, il y a un remove(where:) bien pratique.
    Mais entre temps, non, à moins d'utiliser un filter()...

    De toute manière, Swift 4.2 sera disponible avant la fin du mois avec la version officielle d'XCode 10.

    C'est disponible depuis ce soir ..

Connectez-vous ou Inscrivez-vous pour répondre.