O Swift tem algo como _.findWhere in Underscore.js?
Eu tenho uma matriz de estruturas do tipo T
e gostaria de verificar se a matriz contém um objeto struct cuja name
propriedade é igual a Foo
.
Tentou usar find()
e, filter()
mas eles só funcionam com tipos primitivos, por exemplo, String
ou Int
. Lança um erro sobre não estar em conformidade com o Equitable
protocolo ou algo assim.
Respostas:
FWIW, se você não quiser usar a função ou extensão personalizada, poderá:
Isso gera o
name
array primeiro e depois afind
partir dele.Se você tiver uma variedade enorme, convém:
ou talvez:
fonte
SWIFT 5
Verifique se o elemento existe
Obter o elemento
Obter o elemento e seu deslocamento
Obter o deslocamento
fonte
$0.name == "foo"
fazer uma operação e$0.name == "boo"
fazer outra operaçãoVocê pode usar o
index
método disponívelArray
com um predicado ( consulte a documentação da Apple aqui ).Para o seu exemplo específico, isso seria:
Swift 5.0
Swift 3.0
Swift 2.0
fonte
Swift 3
Se você precisar do objeto, use:
(Se você tiver mais de um objeto chamado "Foo",
first
retornará o primeiro objeto de uma ordem não especificada)fonte
array.first {$0.name == "Foo"}
array.first(where: {$0.name == "Foo"})
Você pode filtrar a matriz e, em seguida, basta escolher o primeiro elemento, conforme mostrado em Localizar objeto com propriedade na matriz .
Ou você define uma extensão personalizada
Exemplo de uso:
No Swift 3, você pode usar o
first(where:)
método existente (conforme mencionado em um comentário ):fonte
array.lazy.filter( predicate ).first
? Qual a eficiência do .lazy para pequenas matrizes?filter
é sempreO(n)
enquanto nofindFirstMatching
é apenas no pior cenário (quando o elemento que você está procurando é o último ou não no array). 2.filter
cria uma matriz completamente nova de elementos filtrados, enquanto ofindFirstMatching
just retorna o elemento solicitado.Swift 3.0
Swift 2.1
A filtragem nas propriedades do objeto agora é suportada no swift 2.1. Você pode filtrar sua matriz com base em qualquer valor da estrutura ou classe. Aqui está um exemplo
OU
fonte
Swift 4 ,
Outra maneira de conseguir isso usando a função de filtro,
fonte
Swift 3
você pode usar o índice (onde :) no Swift 3
exemplo
fonte
$0.name == "Foo"
?Swift 3
fonte
Swift 2 ou posterior
Você pode combinar
indexOf
emap
escrever uma função "encontrar elemento" em uma única linha.Usar
filter
+first
parece mais limpo, masfilter
avalia todos os elementos na matriz.indexOf
+map
parece complicado, mas a avaliação para quando a primeira correspondência na matriz é encontrada. Ambas as abordagens têm prós e contras.fonte
Use
contains
:Ou você pode tentar o que Martin apontou nos comentários e fazer
filter
outra tentativa: Localizar objeto com propriedade na matriz .fonte
item
é do mesmo tipo que o item na matriz. No entanto, tudo o que tenho é apenas um títuloview.annotation.title
. Eu preciso comparar itens na matriz por este título.if contains(yourArray, view.annotation.title) { // code goes here }
.Outra maneira de obter acesso ao array.index (de: Qualquer) é declarando seu objeto
fonte
Use Dollar, que é Lo-Dash ou Underscore.js para Swift:
fonte
Swift 3:
Você pode usar a funcionalidade incorporada do Swifts para encontrar objetos personalizados em uma matriz.
Primeiro, você deve garantir que seu objeto personalizado esteja em conformidade com o: Protocolo equável .
Com a funcionalidade Equatable adicionada ao seu objeto, o Swift agora mostrará propriedades adicionais que você pode usar em uma matriz:
fonte
Para o Swift 3,
fonte
Por exemplo, se tivéssemos uma matriz de números:
Poderíamos encontrar o primeiro número ímpar como este:
Isso retornará 4 como um número inteiro opcional, porque o primeiro número ímpar (9) está no índice quatro.
fonte