arrays - objetos - saber si un elemento existe en un array angularjs
¿Taquigrafía para probar si un objeto existe en una matriz para Swift? (2)
Actualmente, tengo una serie de objetos como este:
var myArr = [
MyObject(name: "Abc", description: "Lorem ipsum 1."),
MyObject(name: "Def", description: "Lorem ipsum 2."),
MyObject(name: "Xyz", description: "Lorem ipsum 3.")
]
Estoy probando si existe un objeto antes de proceder de esta manera:
let item = myArr.filter { $0.name == "Def" }.first
if item != nil {
// Do something...
}
Pero estoy buscando una forma más corta de hacer esto ya que estoy haciendo esto mucho. Me gustaría hacer algo como esto pero no es válido:
if myArr.contains { $0.name == "Def" } {
// Do something...
}
¿Hay alguna sintaxis taquigráfica que falte o una mejor manera de hacerlo?
¿Por qué no usar la función contains()
? Se presenta en dos sabores.
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
y el primero toma un predicado como argumento.
if contains(myArr, { $0.name == "Def" }) {
println("yes")
}
Actualización: a partir de Swift 2, ambas funciones globales de contains()
se han reemplazado por métodos de extensión de protocolo :
extension SequenceType where Generator.Element : Equatable {
func contains(element: Self.Generator.Element) -> Bool
}
extension SequenceType {
func contains(@noescape predicate: (Self.Generator.Element) -> Bool) -> Bool
}
y el primero (basado en predicados) se usa como:
if myArr.contains( { $0.name == "Def" }) {
print("yes")
}
Swift 3:
if myArr.contains(where: { $0.name == "Def" }) {
print("yes")
}
En mi humilde opinión para lograr el comportamiento deseado, tendría que crear una clase de extensión a la matriz que se vería como:
extension Array {
func contains(test: (T) -> Bool, action: (T) -> Void) {
let filtered = self.filter(test)
if(filtered.isEmpty) {
action(filtered)
}
}
}
No tengo xcode delante de mí, así que me disculpo si tengo un error de sintaxis. Sin embargo, si está utilizando la frecuencia, puede escribirla de la siguiente manera
myArr.contains({ $0.name == "Def"}) {
// Do something...
}
Lo renombraría para evitar confusiones en su código.