¿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
?enumerating
por Swift 4. ¡Emocionante!for (index, element) in
cuando se usaenumerated
es engañoso. debería serfor (offset, element) in
Swift 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 ,
forEach
puede 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 elArraySlice
tipo. 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 element
Sí, 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. :)filter
primero?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 eloffset
y 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
enumeratedIndices
haciendo un bucle conzip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Por cierto, no me gusta el nombre que elegí,indexedElements
podría describir mejor lo que hacefor
bucle funciona, pero tambiénzip(self.indices, self) .forEach(body)
forEach
hace 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
forEach
mé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