¿Cómo encontrar el índice de un elemento de la lista en Swift?
Estoy tratando de encontrar un item index
buscando un list
. ¿Alguien sabe cómo hacer eso?
Veo que lo hay list.StartIndex
y list.EndIndex
quiero algo como el de 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 "buscar" 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
Utilice firstIndex
y lastIndex
, dependiendo de si busca 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
tl;dr:
Para clases, es posible que estés buscando:
let index = someArray.firstIndex{$0 === someObject}
Respuesta completa:
Creo que vale la pena mencionar que con los tipos de referencia ( class
) es posible que desees realizar una comparación de identidad , en cuyo caso solo necesitas usar el ===
operador de identidad en el cierre del predicado:
Rápido 5, Rápido 4.2:
let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")
let people = [person1, person2, person3]
let indexOfPerson1 = people.firstIndex{$0 === person1} // 0
let indexOfPerson2 = people.firstIndex{$0 === person2} // 1
let indexOfPerson3 = people.firstIndex{$0 === person3} // 2
let indexOfPerson4 = people.firstIndex{$0 === person4} // nil
Tenga en cuenta que la sintaxis anterior utiliza la sintaxis de cierres finales y es equivalente a:
let indexOfPerson1 = people.firstIndex(where: {$0 === person1})
Swift 4 / Swift 3: la función que solía llamarseindex
Swift 2: la función solía llamarseindexOf
* Tenga en cuenta el comentario relevante y útil de paulbailey sobre class
los tipos que implementan Equatable
, donde debe considerar si debe comparar usando ===
( operador de identidad ) u ==
( operador de igualdad ). Si decide hacer coincidir usando ==
, simplemente puede usar el método sugerido por otros ( people.firstIndex(of: person1)
).
Puedes filter
crear una matriz con un cierre:
var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 } // <= returns [3]
Y puedes contar una matriz:
filtered.count // <= returns 1
Entonces puedes determinar si una matriz incluye tu elemento combinando estos:
myList.filter { $0 == 3 }.count > 0 // <= returns true if the array includes 3
Si quieres encontrar la posición, no veo una manera elegante, pero ciertamente puedes hacerlo así:
var found: Int? // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
if x[i] == 3 {
found = i
}
}
EDITAR
Mientras estamos en eso, para un ejercicio divertido, amplíemoslo Array
para tener un find
método:
extension Array {
func find(includedElement: T -> Bool) -> Int? {
for (idx, element) in enumerate(self) {
if includedElement(element) {
return idx
}
}
return nil
}
}
Ahora podemos hacer esto:
myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found