Estoy tratando de encontrar un item indexmediante la búsqueda de a list. ¿Alguien sabe cómo hacer eso?
Veo que hay list.StartIndexy list.EndIndexquiero 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 findfunción anterior ya no es compatible con Swift 2.0!
Con Swift 2.0, Arraygana la capacidad de encontrar el índice de un elemento usando una función definida en una extensión de CollectionType(que Arrayimplementa):
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 findhizo 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 Equatableusted, 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, indexya no se usa, pero se separa en firstIndexy lastIndexpara 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
indexOfuna matriz de estructuras que usted mismo definió, su estructura debe cumplir con elEquatableprotocolo.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
indexSwift 2 - la función solía llamarse
indexOf* Tenga en cuenta el comentario relevante y útil de paulbailey sobre los
classtipos 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
Personimplementa elEquatableprotocolo, esto no sería necesario.Binary operator '===' cannot be applied to operands of type '_' and 'Post',Postes 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 semyStructajusta aEquatable(==)).Puede
filteruna 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
Arraypara tener unfindmétodo:Ahora podemos hacer esto:
fuente
Arraypara tener unfindmétodo que haga lo que quieras. Todavía no sé si esta es una buena práctica, pero es un buen experimento.enumeratepara 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 deselfes 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),
Arrayincluye unindexOfmétodo proporcionado por elCollectionTypeprotocolo. (En realidad, dosindexOfmé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
indexOfObjectmé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 tuArrayaNSArray, 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
Arrayobjeto.Para obtener el índice del elemento
rose, todo lo que tiene que hacer es:Nota:
Array.index(of:)devuelve unOptional<Int>.nilimplica que el elemento no está presente en la matriz.Es posible que desee desenrollar forzosamente el valor devuelto o usar un
if-letpara evitar lo opcional.fuente
Simplemente use el método firstIndex.
fuente