¿Cómo encontrar el índice de un elemento de la lista en Swift?

Resuelto Chéyo asked hace 10 años • 23 respuestas

Estoy tratando de encontrar un item indexbuscando un list. ¿Alguien sabe cómo hacer eso?

Veo que lo hay list.StartIndexy list.EndIndexquiero algo como el de Python list.index("text").

Chéyo avatar Jun 04 '14 11:06 Chéyo
Aceptado

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 firstIndexy 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
Sebastian Schuth avatar Jun 05 '2014 20:06 Sebastian Schuth

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 classlos 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)).

Nikolay Suvandzhiev avatar Oct 03 '2015 13:10 Nikolay Suvandzhiev

Puedes filtercrear 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 Arraypara tener un findmé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
gwcoffey avatar Jun 04 '2014 04:06 gwcoffey