Atualmente, tenho uma matriz de objects como esta:
var myArr = [ MyObject(name: "Abc", description: "Lorem ipsum 1."), MyObject(name: "Def", description: "Lorem ipsum 2."), MyObject(name: "Xyz", description: "Lorem ipsum 3.") ]
Eu estou testando se um object existe antes de continuar assim:
let item = myArr.filter { $0.name == "Def" }.first if item != nil { // Do something... }
Mas estou procurando uma maneira mais curta de fazer isso, já que estou fazendo muito isso. Eu gostaria de fazer algo assim, mas é inválido:
if myArr.contains { $0.name == "Def" } { // Do something... }
Existe alguma syntax abreviada que estou perdendo ou uma maneira melhor de fazer isso?
Por que não usar a function incorporada contains()
? Vem em dois sabores
func contains(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool func contains(seq: S, x: S.Generator.Element) -> Bool
e o primeiro toma um predicado como argumento.
if contains(myArr, { $0.name == "Def" }) { println("yes") }
Atualização: A partir do Swift 2, ambas as funções globais contains()
foram substituídas pelos methods de extensão 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 }
e o primeiro (baseado em predicado) é usado como:
if myArr.contains( { $0.name == "Def" }) { print("yes") }
Swift 3:
if myArr.contains(where: { $0.name == "Def" }) { print("yes") }
IMHO para alcançar o comportamento desejado, você teria que criar uma class de extensão para o array que seria algo como:
extension Array { func contains(test: (T) -> Bool, action: (T) -> Void) { let filtered = self.filter(test) if(filtered.isEmpty) { action(filtered) } } }
Eu não tenho xcode na minha frente, então peço desculpas se eu tiver um erro de syntax. No entanto, se você estiver usando o frequentemente você pode escrevê-lo da seguinte forma
myArr.contains({ $0.name == "Def"}) { // Do something... }
Eu mudaria o nome para evitar confusão no seu código.