Estoy tratando de encontrar un item index
mediante la búsqueda de a list
. ¿Alguien sabe cómo hacer eso?
Veo que hay list.StartIndex
y list.EndIndex
quiero algo como Python list.index("text")
.
Como swift es en algunos aspectos más funcional que orientado a objetos (y las matrices son estructuras, no objetos), use la función "find" para operar en la matriz, que devuelve un valor opcional, así que prepárese para manejar un valor nulo:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Actualización para Swift 2.0:
¡La find
función anterior ya no es compatible con Swift 2.0!
Con Swift 2.0, Array
gana la capacidad de encontrar el índice de un elemento usando una función definida en una extensión de CollectionType
(que Array
implementa):
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
Además, encontrar el primer elemento en una matriz que cumple un predicado es compatible con otra extensión de CollectionType
:
let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil
Tenga en cuenta que estas dos funciones devuelven valores opcionales, como lo find
hizo antes.
Actualización para Swift 3.0:
Tenga en cuenta que la sintaxis de indexOf ha cambiado. Para los artículos que se ajustan a Equatable
usted, puede usar:
let indexOfA = arr.index(of: "a")
Se puede encontrar una documentación detallada del método en https://developer.apple.com/reference/swift/array/1689674-index
Para los elementos de la matriz que no se ajustan Equatable
, deberá usar index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Actualización para Swift 4.2:
Con Swift 4.2, index
ya no se usa, pero se separa en firstIndex
y lastIndex
para una mejor aclaración. Entonces, dependiendo de si está buscando el primer o el último índice del artículo:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
una matriz de estructuras que usted mismo definió, su estructura debe cumplir con elEquatable
protocolo.tl; dr:
Para las clases, podrías estar buscando:
Respuesta completa:
Creo que vale la pena mencionar que con los tipos de referencia (
class
) es posible que desee realizar una comparación de identidad , en cuyo caso solo necesita usar el===
operador de identidad en el cierre del predicado:Swift 5, Swift 4.2:
Tenga en cuenta que la sintaxis anterior utiliza la sintaxis de cierre final y es equivalente a:
Swift 4 / Swift 3 - la función solía llamarse
index
Swift 2 - la función solía llamarse
indexOf
* Tenga en cuenta el comentario relevante y útil de paulbailey sobre los
class
tipos que implementanEquatable
, donde debe considerar si debe comparar utilizando===
( operador de identidad ) o==
( operador de igualdad ). Si decide hacer coincidir el uso==
, simplemente puede usar el método sugerido por otros (people.firstIndex(of: person1)
).fuente
Person
implementa elEquatable
protocolo, esto no sería necesario.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
es mi struct ... alguna idea?structs
(yenums
) son tipos de valor, no tipos de referencia. Solo los tipos de referencia (pclass
. Ej. ) Tienen lógica de comparación de identidad (===
). Echa un vistazo a las otras respuestas para saber qué hacerstructs
(básicamente, simplemente usas elarray.index(of: myStruct)
, asegurándote de que el tipo semyStruct
ajusta aEquatable
(==
)).Puede
filter
una matriz con un cierre:Y puedes contar una matriz:
Para que pueda determinar si una matriz incluye su elemento combinando estos:
Si quieres encontrar la posición, no veo una manera elegante, pero ciertamente puedes hacerlo así:
EDITAR
Mientras estamos en eso, para un ejercicio divertido, extendamos
Array
para tener unfind
método:Ahora podemos hacer esto:
fuente
Array
para tener unfind
método que haga lo que quieras. Todavía no sé si esta es una buena práctica, pero es un buen experimento.enumerate
para que no se aplique, pero tiene toda la razón.Swift 5
Ejemplo 1
Ejemplo2
fuente
Si bien
indexOf()
funciona perfectamente, solo devuelve un índice.Estaba buscando una forma elegante de obtener una variedad de índices para elementos que satisfagan alguna condición.
Así es como se puede hacer:
Swift 3:
Swift 2:
fuente
Para la clase personalizada, debe implementar el protocolo Equatable.
fuente
Actualización para Swift 2:
Swift 1:
Si solo busca verificar si un elemento está contenido dentro de una matriz, es decir, solo obtenga un indicador booleano, use en
contains(sequence, element)
lugar defind(array, element)
:Ver ejemplo a continuación:
fuente
en Swift 4.2
.index (donde :) se cambió a .firstIndex (donde :)
fuente
Swift 4. Si su matriz contiene elementos de tipo [String: AnyObject]. Entonces, para encontrar el índice del elemento, use el siguiente código
O bien, si desea encontrar el índice en función de la clave del diccionario. Aquí la matriz contiene objetos de la clase Modelo y estoy haciendo coincidir la propiedad id.
fuente
Swift 2.1
Swift 3
fuente
let array
? El uso deself
es cuestionable también.En Swift 4 , si está atravesando su matriz DataModel, asegúrese de que su modelo de datos cumpla con el Protocolo Equivalente, implemente el método lhs = rhs, y solo entonces puede usar ".index (de". Por ejemplo
Y entonces,
fuente
En Swift 2 (con Xcode 7),
Array
incluye unindexOf
método proporcionado por elCollectionType
protocolo. (En realidad, dosindexOf
métodos: uno que usa la igualdad para un argumento y otro que usa un cierre).Antes de Swift 2, no había una forma para que los tipos genéricos, como las colecciones, proporcionaran métodos para los tipos concretos derivados de ellos (como las matrices). Entonces, en Swift 1.x, "índice de" es una función global ... Y también se renombró, así que en Swift 1.x, esa función global se llama
find
.También es posible (pero no necesario) usar el
indexOfObject
método deNSArray
... o cualquiera de los otros métodos de búsqueda más sofisticados de Foundation que no tienen equivalentes en la biblioteca estándar de Swift. Soloimport Foundation
(u otro módulo que importe de manera transitiva Foundation), emite tuArray
aNSArray
, y puede usar los muchos métodos de búsquedaNSArray
.fuente
Cualquiera de esta solución me funciona
Esta es la solución que tengo para Swift 4:
fuente
También puede usar la biblioteca funcional Dollar para hacer un indexOf en una matriz como http://www.dollarswift.org/#indexof-indexof
fuente
Si todavía está trabajando en Swift 1.x
entonces intenta,
fuente
Para SWIFT 3 puede usar una función simple
Esto le dará la posición del número, por lo que puede usar como
Espero ser útil
fuente
SWIFT 4
Digamos que desea almacenar un número de la matriz llamada cardButtons en cardNumber, puede hacerlo de esta manera:
remitente es el nombre de su botón
fuente
Swift 4
Para tipos de referencia:
fuente
En Swift 4/5, use "firstIndex" para encontrar el índice.
fuente
En caso de que alguien tenga este problema
solo haz esto
entonces
fuente
por
(>= swift 4.0)
Es bastante muy simple. Considere el siguiente
Array
objeto.Para obtener el índice del elemento
rose
, todo lo que tiene que hacer es:Nota:
Array.index(of:)
devuelve unOptional<Int>
.nil
implica que el elemento no está presente en la matriz.Es posible que desee desenrollar forzosamente el valor devuelto o usar un
if-let
para evitar lo opcional.fuente
Simplemente use el método firstIndex.
fuente