Se puede utilizar enumerate
para convertir una secuencia ( Array
, String
, etc.) a una secuencia de tuplas con un contador de números enteros y y el elemento emparejado juntos. Es decir:
let numbers = [7, 8, 9, 10]
let indexAndNum: [String] = numbers.enumerate().map { (index, element) in
return "\(index): \(element)"
}
print(indexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Enlace a la enumerate
definición
Tenga en cuenta que esto no es lo mismo que obtener el índice de la colección: enumerate
le devuelve un contador entero. Esto es lo mismo que el índice para una matriz, pero en una cadena o diccionario no será muy útil. Para obtener el índice real junto con cada elemento, puede usar zip
:
let actualIndexAndNum: [String] = zip(numbers.indices, numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Al usar una secuencia enumerada con reduce
, no podrá separar el índice y el elemento en una tupla, ya que ya tiene la tupla acumulada / actual en la firma del método. En su lugar, deberá usar .0
y .1
en el segundo parámetro para su reduce
cierre:
let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56
Swift 3.0 y superior
Desde la sintaxis de Swift 3.0 es bastante diferente.
Además, puede usar sintaxis corta / en línea para mapear la matriz en el diccionario:
let numbers = [7, 8, 9, 10]
let array: [(Int, Int)] = numbers.enumerated().map { ($0, $1) }
// ^ ^
// index element
Eso produce:
[(0, 7), (1, 8), (2, 9), (3, 10)]
numbers.enumerate().map { (index, element) in ...
.reduce
despuésenumerate()
ozip
.enumerate
es ahoraenumerated
Porque
Swift 2.1
escribí la siguiente función:Y luego úsalo así:
fuente
Con Swift 3, cuando tiene un objeto que se ajusta al
Sequence
protocolo y desea vincular cada elemento dentro de él con su índice, puede usar elenumerated()
método.Por ejemplo:
Por lo tanto, en el caso más simple, puede implementar un algoritmo Luhn en un área de juegos como este:
Si comienza desde a
String
, puede implementarlo así:Si necesita repetir esas operaciones, puede refactorizar su código en una extensión:
O, de una manera muy concisa:
fuente
Además del ejemplo de Nate Cook
map
, también puede aplicar este comportamientoreduce
.Tenga en cuenta que el
EnumerateSequence
paso al cierreenumerated
no puede descomponerse de forma anidada, por lo que los miembros de la tupla deben descomponerse dentro del cierre (es decirenumerated.index
).fuente
Esta es una extensión de CollectionType que funciona para Swift 2.1 usando lanzamientos y repeticiones:
Sé que esto no es lo que estabas preguntando, pero resuelve tu problema. Puedes probar este método Swift 2.0 Luhn sin extender nada:
fuente