Se puede utilizar enumeratepara 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 enumeratedefinición
Tenga en cuenta que esto no es lo mismo que obtener el índice de la colección: enumeratele 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 .0y .1en el segundo parámetro para su reducecierre:
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 ....reducedespuésenumerate()ozip.enumeratees ahoraenumeratedPorque
Swift 2.1escribí la siguiente función:Y luego úsalo así:
fuente
Con Swift 3, cuando tiene un objeto que se ajusta al
Sequenceprotocolo 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
EnumerateSequencepaso al cierreenumeratedno 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