¿Hay una función que pueda usar para iterar sobre una matriz y tener tanto índice como elemento, como la enumeración de Python?
for index, element in enumerate(list):
...
arrays
swift
enumeration
pensador3
fuente
fuente

enumerate?enumeratingpor Swift 4. ¡Emocionante!for (index, element) incuando se usaenumeratedes engañoso. debería serfor (offset, element) inSwift 5 proporciona un método llamado
enumerated()paraArray.enumerated()tiene la siguiente declaración:En los casos más simples, puede usar
enumerated()con un bucle for. Por ejemplo:Sin embargo, tenga en cuenta que no está limitado a usar
enumerated()con un bucle for. De hecho, si planea usarenumerated()un bucle for para algo similar al siguiente código, lo está haciendo mal:Una forma más rápida de hacer esto es:
Como alternativa, también puede usar
enumerated()conmap:Además, aunque tiene algunas limitaciones ,
forEachpuede ser un buen reemplazo para un bucle for:Al usar
enumerated()ymakeIterator(), incluso puede iterar manualmente en suArray. Por ejemplo:fuente
enumerate?Comenzando con Swift 2, la función de enumeración debe llamarse en la colección de la siguiente manera:
fuente
Encontré esta respuesta mientras buscaba una manera de hacerlo con un Diccionario , y resulta que es bastante fácil adaptarlo, solo pasa una tupla para el elemento.
fuente
Simplemente puede usar el ciclo de enumeración para obtener el resultado deseado:
Swift 2:
Swift 3 y 4:
O simplemente puede pasar por un bucle for para obtener el mismo resultado:
Espero eso ayude.
fuente
Enumeración básica
o con Swift 3 ...
Enumerar, filtrar y mapear
Sin embargo, con mayor frecuencia uso enumerate en combinación con map o filter. Por ejemplo, con operar en un par de matrices.
En esta matriz, quería filtrar elementos indexados impares o pares y convertirlos de Ints a Dobles. Entonces
enumerate()obtiene su índice y el elemento, luego el filtro verifica el índice y, finalmente, para deshacerme de la tupla resultante, lo mapeo solo al elemento.fuente
Usando
.enumerate()trabajos, pero no proporciona el índice verdadero del elemento; solo proporciona un Int que comienza con 0 y se incrementa en 1 para cada elemento sucesivo. Esto suele ser irrelevante, pero existe la posibilidad de un comportamiento inesperado cuando se usa con elArraySlicetipo. Toma el siguiente código:Es un ejemplo un tanto artificial, y no es un problema común en la práctica, pero creo que vale la pena saber que esto puede suceder.
fuente
it does not actually provide the true index of the element; it only provides an Int beginning with 0 and incrementing by 1 for each successive elementSí, por eso se llama enumerar . Además, el segmento no es una matriz, por lo que no sorprende que se comporte de manera diferente. No hay ningún error aquí: todo es por diseño. :)filterprimero?Comenzando con Swift 3, es
fuente
Para completar, simplemente puede iterar sobre los índices de su matriz y usar el subíndice para acceder al elemento en el índice correspondiente:
Usando para cada
Usando el
enumerated()método de recolección . Tenga en cuenta que devuelve una colección de tuplas con eloffsety elelement:utilizando forEach:
Esos imprimirán
Si necesita el índice de matriz (no el desplazamiento) y su elemento, puede extender la Colección y crear su propio método para obtener los elementos indexados:
Otra posible implementación según lo sugerido por Alex es comprimir los índices de colección con sus elementos:
Pruebas:
Esto p [rint
fuente
enumeratedIndiceshaciendo un bucle conzip(self.indices, self)for element in zip(indices, self) { try body(element) }. Por cierto, no me gusta el nombre que elegí,indexedElementspodría describir mejor lo que haceforbucle funciona, pero tambiénzip(self.indices, self) .forEach(body)forEachhace un bucle for detrás de escena. Prefiero mantenerlo simple github.com/apple/swift/blob/master/stdlib/public/core/…@inlinable public func forEach( _ body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } }Esta es la fórmula del bucle de enumeración:
Para más detalles puede consultar aquí .
fuente
Personalmente prefiero usar el
forEachmétodo:También puedes usar la versión corta:
fuente
Xcode 8 y Swift 3: la matriz se puede enumerar usando
tempArray.enumerated()Ejemplo:
consola:
fuente
Para aquellos que quieran usar
forEach.Swift 4
O
fuente
Para lo que desea hacer, debe usar el
enumerated()método en su matriz :fuente
Llamamos a la función enumerate para implementar esto. me gusta
fuente