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?
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")
}
À 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.isEmpty) {
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.