web-dev-qa-db-fra.com

Raccourci pour tester si un objet existe dans un tableau pour Swift?

Actuellement, j'ai un tableau d'objets comme celui-ci:

var myArr = [
  MyObject(name: "Abc", description: "Lorem ipsum 1."),
  MyObject(name: "Def", description: "Lorem ipsum 2."),
  MyObject(name: "Xyz", description: "Lorem ipsum 3.")
]

Je teste si un objet existe avant de procéder comme ceci:

let item = myArr.filter { $0.name == "Def" }.first
if item != nil {
  // Do something...
}

Mais je cherche un moyen plus court de le faire car je fais beaucoup ça. Je voudrais faire quelque chose comme ça mais ce n'est pas valide:

if myArr.contains { $0.name == "Def" } {
  // Do something...
}

Y a-t-il une syntaxe abrégée qui me manque ou une meilleure façon de le faire?

22
TruMan1

Pourquoi ne pas utiliser la fonction contains() intégrée? Il se décline en deux saveurs

func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool
func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool

et le premier prend un prédicat comme argument.

if contains(myArr, { $0.name == "Def" }) {
    println("yes")
}

Mise à jour: à partir de Swift 2, les deux fonctions globales contains() ont été remplacées par les méthodes d'extension de protocole :

extension SequenceType where Generator.Element : Equatable {
    func contains(element: Self.Generator.Element) -> Bool
}

extension SequenceType {
    func contains(@noescape predicate: (Self.Generator.Element) -> Bool) -> Bool
}

et le premier (basé sur les prédicats) est utilisé comme:

if myArr.contains( { $0.name == "Def" }) {
    print("yes")
}

Swift 3:

if myArr.contains(where: { $0.name == "Def" }) {
    print("yes")
}
52
Martin R

À mon humble avis, pour obtenir le comportement souhaité, vous devez créer une classe d'extension pour le tableau qui ressemblerait à quelque chose comme:

extension Array {
    func contains(test: (T) -> Bool, action: (T) -> Void) {
        let filtered = self.filter(test)
        if(filtered.is​Empty) {
            action(filtered)
        }
    }
}

Je n'ai pas de xcode devant moi donc je m'excuse si j'ai une erreur de syntaxe. Cependant, si vous utilisez souvent, vous pouvez l'écrire comme suit

myArr.contains({ $0.name == "Def"}) {
   // Do something...
}

Je le renommerais pour éviter toute confusion dans votre code.

2
Nathan