que - taylor swift singles reputation
¿Cómo puedo encontrar el índice de un artículo en Swift? (7)
Esta pregunta ya tiene una respuesta aquí:
¿Hay un método llamado indexof o algo similar?
var array = ["Jason", "Charles", "David"]
indexOf(array, "Jason") // Should return 0
EDITAR: a partir de Swift 3.0, debe usar el .index(where:)
lugar y seguir el cambio en la edición de Swift 2.0 a continuación.
EDITAR: a partir de Swift 2.0, debe usar el método indexOf
lugar. También devuelve nil
o el primer índice de su argumento.
if let i = array.indexOf("Jason") {
print("Jason is at index /(i)")
} else {
print("Jason isn''t in the array")
}
Use la función de find
. Devuelve nil
(si no se encuentra el valor) o el primer índice del valor en la matriz.
if let i = find(array, "Jason") {
println("Jason is at index /(i)")
} else {
println("Jason isn''t in the array")
}
En Swift 2.0 (Xcode 7.1b), puede usar
if let result = array.indexOf("Jason")
while find(array, "Jason")
está en desuso.
Hice esta función como la anterior, pero devuelve una matriz de índices
extension Array {
func indexesOf<T : Equatable>(object:T) -> [Int] {
var result: [Int] = []
for (index,obj) in enumerate(self) {
if obj as T == object {
result.append(index)
}
}
return result
}
}
Tal vez te sea útil
La matriz se puede unir a una NSArray, por lo que puede usar:
array.bridgeToObjectiveC().indexOfObject("Jason")
Puede agregar una extensión de matriz que hace exactamente lo que desea, es decir:
extension Array {
func indexOf<T : Equatable>(x:T) -> Int? {
for i in 0..self.count {
if self[i] as T == x {
return i
}
}
return nil
}
}
Que ahora te permite usar .indexOf()
en todas las matrices Swift, por ejemplo:
["Jason", "Charles", "David"].indexOf("Jason") //0
Si bien la respuesta de Max es excelente, no le permite encontrar múltiples índices de múltiples objetos, es decir. índices del subconjunto de la matriz. Si necesita esa funcionalidad, las extensiones son, como siempre, su mejor amigo
func indexesOfSubset<T : Equatable>(objects : [T]) -> [Int] {
// Create storage for filtered objectsand results
var unusedObjects = objects
var result : [Int] = []
// Enumerate through all objects in array
for (index, obj) in enumerate(self) {
// Enumerate again through all objects that has not been found
for x in unusedObjects {
// If we hit match, append result, remove it from usused objects
if obj as! T == x {
result.append(index)
unusedObjects = unusedObjects.filter( { $0 != x } )
break
}
}
}
// Get results
return result
}
Nota *: funciona en Swift 1.2, si desea compatibilidad con 1.1, reemplace como! -> como
Una extensión de Array puede hacer maravillas aquí. Aquí hay una implementación compartida en esta respuesta de :
extension Array {
func find (includedElement: T -> Bool) -> Int? {
for (idx, element) in enumerate(self) {
if includedElement(element) {
return idx
}
}
return nil
}
}