Vous pouvez utiliser enumerate
pour convertir une séquence ( Array
, String
, etc.) à une séquence de tuples d'un compteur de nombre entier et et l' élément jumelés. C'est:
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"]
Lien vers la enumerate
définition
Notez que ce n'est pas la même chose que d'obtenir l' index de la collection - enumerate
vous renvoie un compteur entier. C'est le même que l'index pour un tableau, mais sur une chaîne ou un dictionnaire ne sera pas très utile. Pour obtenir l'index réel avec chaque élément, vous pouvez utiliser zip
:
let actualIndexAndNum: [String] = zip(numbers.indices, numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Lorsque vous utilisez une séquence énumérée avec reduce
, vous ne pourrez pas séparer l'index et l'élément dans un tuple, car vous avez déjà le tuple cumulatif / actuel dans la signature de la méthode. Au lieu de cela, vous devrez utiliser .0
et .1
sur le deuxième paramètre de votre reduce
fermeture:
let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56
Swift 3.0 et supérieur
Depuis la syntaxe Swift 3.0 est assez différente.
En outre, vous pouvez utiliser la syntaxe courte / en ligne pour mapper le tableau sur le dictionnaire:
let numbers = [7, 8, 9, 10]
let array: [(Int, Int)] = numbers.enumerated().map { ($0, $1) }
// ^ ^
// index element
Cela produit:
[(0, 7), (1, 8), (2, 9), (3, 10)]
numbers.enumerate().map { (index, element) in ...
.reduce
aprèsenumerate()
ouzip
.enumerate
est maintenantenumerated
Car
Swift 2.1
j'ai écrit la fonction suivante:Et puis utilisez-le comme ceci:
la source
Avec Swift 3, lorsque vous avez un objet conforme au
Sequence
protocole et que vous souhaitez lier chaque élément à l'intérieur de celui-ci avec son index, vous pouvez utiliserenumerated()
method.Par exemple:
Par conséquent, dans le cas le plus simple, vous pouvez implémenter un algorithme de Luhn dans un Playground comme ceci:
Si vous partez d'un
String
, vous pouvez l'implémenter comme ceci:Si vous devez répéter ces opérations, vous pouvez refactoriser votre code en une extension:
Ou, d'une manière très concise:
la source
En plus de l'exemple de Nate Cook
map
, vous pouvez également appliquer ce comportement àreduce
.Notez que le
EnumerateSequence
passé dans la fermetureenumerated
ne peut pas être décomposé de manière imbriquée, donc les membres du tuple doivent être décomposés à l'intérieur de la fermeture (c'est-à-direenumerated.index
).la source
Il s'agit d'une extension CollectionType fonctionnelle pour swift 2.1 utilisant des lancers et des renvois:
Je sais que ce n'est pas ce que vous demandiez, mais cela résout votre problème. Vous pouvez essayer cette méthode Luhn 2.0 rapide sans rien étendre:
la source