En Swift, ¿cómo puedo verificar si un elemento existe en una matriz? Xcode no tiene ninguna sugerencia para contain
, include
o has
, y una búsqueda rápida a través del libro resultó en nada. ¿Alguna idea de cómo verificar esto? Sé que hay un método find
que devuelve el número de índice, pero ¿hay algún método que devuelva un valor booleano como el de Ruby #include?
?
Ejemplo de lo que necesito:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
if find(elements, 5) != nil { }
¿No es suficientemente bueno?Respuestas:
Swift 2, 3, 4, 5:
contains()
es un método de extensión de protocolo deSequenceType
(para secuencias deEquatable
elementos) y no un método global como en versiones anteriores.Observaciones:
contains()
método requiere que los elementos de secuencia adopten elEquatable
protocolo, compare, por ejemplo, la respuesta de Andrews .NSObject
subclase, debe anularisEqual:
, vea la subclase NSObject en Swift: hash vs hashValue, isEqual vs == .contains()
método, más general, que no requiere que los elementos sean equiparables y que tome un predicado como argumento. Consulte, por ejemplo, Taquigrafía para probar si un objeto existe en una matriz para Swift..Versiones anteriores de Swift:
fuente
Equatable
protocolo (queDictionary<String, AnyObject>
no lo hace). Hay una segunda variante de lacontains()
cual toma un predicado (compare stackoverflow.com/questions/29679486/… ) tal vez pueda usar eso, por ejemploif contains(array, { $0 == dict } ) ...
Para aquellos que vinieron aquí buscando un hallazgo y eliminar un objeto de una matriz:
Swift 1
Swift 2
Swift 3, 4
Swift 5.2
fuente
Usa esta extensión:
Usar como:
Actualizado para Swift 2/3
Tenga en cuenta que a partir de Swift 3 (o incluso 2), la extensión ya no es necesaria ya que la
contains
función global se ha convertido en un par de métodos de extensión activadosArray
, que le permiten realizar cualquiera de:fuente
Si está verificando si una instancia de una clase o estructura personalizada está contenida en una matriz, deberá implementar el protocolo Equatable antes de poder usar .contains (myObject).
Por ejemplo:
entonces puedes hacer:
Consejo : La anulación == debe estar a nivel global, no dentro de su clase / estructura
fuente
Usé filtro
Si quieres, puedes comprimir eso para
Espero que ayude.
Actualización para Swift 2
¡Hurra por las implementaciones predeterminadas!
fuente
(Swift 3)
Verifique si un elemento existe en una matriz (cumpliendo algunos criterios), y si es así, continúe trabajando con el primer elemento
Si la intención es:
Entonces, una alternativa a
contains(_:)
blueprintedSequence
esfirst(where:)
deSequence
:En este ejemplo artificial, su uso puede parecer tonto, pero es muy útil si se consultan matrices de tipos de elementos no fundamentales para la existencia de cualquier elemento que cumpla alguna condición. P.ej
Cualquier operación encadenada usando
.filter { ... some condition }.first
puede ser reemplazada favorablemente porfirst(where:)
. Este último muestra una mejor intención y tiene ventajas de rendimiento sobre los posibles dispositivos no perezosos.filter
, ya que estos pasarán la matriz completa antes de extraer el (posible) primer elemento que pasa el filtro.Compruebe si existe un elemento en una matriz (cumpliendo algunos criterios) y , de ser así, elimine el primer elemento
Un comentario debajo de las consultas:
Un caso de uso similar al anterior es eliminar el primer elemento que cumple un predicado dado. Para hacerlo, el
index(where:)
método deCollection
(que está fácilmente disponible para la colección de matrices) puede usarse para encontrar el índice del primer elemento que cumple el predicado, después de lo cual el índice puede usarse con elremove(at:)
método deArray
to (posible; dado que existe) eliminar ese elementoO, si desea eliminar el elemento de la matriz y trabajar con él , aplique
Optional
elmap(_:)
método : s para usar condicionalmente (para.some(...)
regresar deindex(where:)
) el resultado deindex(where:)
eliminar y capturar el elemento eliminado de la matriz (dentro de una cláusula de enlace opcional) .Tenga en cuenta que en el ejemplo artificial anterior, los miembros de la matriz son tipos de valores simples (
String
instancias), por lo que usar un predicado para encontrar un miembro dado es algo excesivo, ya que podríamos simplemente probar la igualdad usando elindex(of:)
método más simple como se muestra en la respuesta de @ DogCoffee .Person
Sin embargo, si aplica el enfoque de buscar y eliminar anterior al ejemplo, usarloindex(where:)
con un predicado es apropiado (ya que ya no probamos la igualdad sino el cumplimiento de un predicado proporcionado).fuente
La forma más sencilla de lograr esto es usar filtro en la matriz.
result
tendrá el elemento encontrado si existe y estará vacío si el elemento no existe. Entonces, simplemente verificar siresult
está vacío le dirá si el elemento existe en la matriz. Yo usaría lo siguiente:fuente
let result = elements.filter { $0==5 }.first
debería lograr lo que estás buscando.Swift 4/5
Otra forma de lograr esto es con la función de filtro
fuente
A partir de Swift 2.1, las matrices NSA
containsObject
pueden usarse de la siguiente manera:fuente
En caso de que alguien esté tratando de encontrar si un
indexPath
está entre los seleccionados (como en unaUICollectionView
oUITableView
cellForItemAtIndexPath
funciones):fuente
Formación
Verificar presencia de elementos
Obtener índice de elementos
Obtener recuento de elementos
fuente
Aquí está mi pequeña extensión que acabo de escribir para verificar si mi matriz de delegado contiene un objeto delegado o no ( Swift 2 ). :) También funciona con tipos de valor como un encanto.
Si tiene una idea de cómo optimizar este código, hágamelo saber.
fuente
si el usuario encuentra elementos de matriz particulares, use el código siguiente igual que el valor entero.
fuente
Rápido
Si no está utilizando un objeto, puede usar este código para contiene.
Si está utilizando la clase NSObject en Swift. Esta variable es de acuerdo a mi requerimiento. Puede modificar para su requisito.
Esto es para un mismo tipo de datos.
Si desea escribir AnyObject.
Condición completa
fuente
¿Qué pasa con el uso de una tabla hash para el trabajo, como este?
primero, creando una función genérica de "mapa hash", extendiendo el protocolo de secuencia.
Esta extensión funcionará siempre que los elementos de la matriz se ajusten a Hashable, como enteros o cadenas, aquí está el uso ...
Pero por ahora, concentrémonos en verificar si el elemento está en la matriz.
fuente
Swift 4.2 +
Puede verificar fácilmente si su instancia es una matriz o no mediante la siguiente función.
Incluso puedes acceder de la siguiente manera. Recibirá
nil
si el objeto no sería una matriz.fuente