¿Swift tiene algo como _.findWhere en Underscore.js?
Tengo una matriz de estructuras de tipo T
y me gustaría verificar si la matriz contiene un objeto de estructura cuya name
propiedad es igual a Foo
.
Intenté usar find()
y filter()
pero solo funcionan con tipos primitivos, por ejemplo, String
o Int
. Lanza un error sobre no cumplir con el Equitable
protocolo o algo así.
Respuestas:
FWIW, si no desea utilizar una función o extensión personalizada, puede:
Esto genera la
name
matriz primero, luegofind
de ella.Si tiene una gran variedad, es posible que desee hacer:
o tal vez:
fuente
SWIFT 5
Verificar si el elemento existe
Obtén el elemento
Obtenga el elemento y su desplazamiento
Consigue el desplazamiento
fuente
$0.name == "foo"
una operación y$0.name == "boo"
otra operaciónPuede usar el
index
método disponibleArray
con un predicado ( consulte la documentación de Apple aquí ).Para su ejemplo específico, esto sería:
Swift 5.0
Swift 3.0
Swift 2.0
fuente
Swift 3
Si necesita el objeto, use:
(Si tiene más de un objeto llamado "Foo"
first
, devolverá el primer objeto de un pedido no especificado)fuente
array.first {$0.name == "Foo"}
array.first(where: {$0.name == "Foo"})
Puede filtrar la matriz y luego simplemente elegir el primer elemento, como se muestra en Buscar objeto con propiedad en matriz .
O define una extensión personalizada
Ejemplo de uso:
En Swift 3 puede usar el
first(where:)
método existente (como se menciona en un comentario ):fuente
array.lazy.filter( predicate ).first
? ¿Qué tan eficiente es .lazy para arreglos pequeños?filter
es siempre,O(n)
mientras que en lafindFirstMatching
es solo en el peor escenario (cuando el elemento que está buscando es el último o no está en la matriz). 2.filter
crea una matriz completamente nueva de elementos filtrados mientras que elfindFirstMatching
solo devuelve el elemento solicitado.Swift 3.0
Swift 2.1
El filtrado en las propiedades del objeto ahora es compatible con swift 2.1. Puede filtrar su matriz en función de cualquier valor de la estructura o clase aquí es un ejemplo
O
fuente
Swift 4 ,
Otra forma de lograr esto usando la función de filtro,
fuente
Swift 3
puedes usar index (where :) en Swift 3
ejemplo
fuente
$0.name == "Foo"
?Swift 3
fuente
Swift 2 o posterior
Puede combinar
indexOf
ymap
escribir una función "buscar elemento" en una sola línea.Usar
filter
+ sefirst
ve más limpio, perofilter
evalúa todos los elementos de la matriz.indexOf
+map
parece complicado, pero la evaluación se detiene cuando se encuentra la primera coincidencia en la matriz. Ambos enfoques tienen pros y contras.fuente
Uso
contains
:O puede probar lo que Martin le indicó, en los comentarios y darle
filter
otra oportunidad: Buscar objeto con propiedad en matriz .fuente
item
es del mismo tipo que el elemento en la matriz. Sin embargo, todo lo que tengo es solo un títuloview.annotation.title
. Necesito comparar elementos en la matriz por este título.if contains(yourArray, view.annotation.title) { // code goes here }
.Otra forma de obtener acceso a array.index (de: Any) es declarando su objeto
fuente
Use Dollar que es Lo-Dash o Underscore.js para Swift:
fuente
Swift 3:
Puede usar la funcionalidad integrada de Swifts para buscar objetos personalizados en una matriz.
Primero debe asegurarse de que su objeto personalizado se ajuste al protocolo : Equatable .
Con la funcionalidad Equatable agregada a su objeto, Swift ahora le mostrará propiedades adicionales que puede usar en una matriz:
fuente
Para Swift 3,
fuente
Por ejemplo, si tuviéramos una serie de números:
Podríamos encontrar el primer número impar como este:
Eso devolverá 4 como un entero opcional, porque el primer número impar (9) está en el índice cuatro.
fuente