Można użyć enumerate
do przekształcenia sekwencji ( Array
, String
etc.) do sekwencji krotki w licznik liczby całkowitej i z elementem skojarzonym razem. To jest:
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"]
Link do enumerate
definicji
Zauważ, że to nie to samo, co pobranie indeksu kolekcji - enumerate
zwraca licznik całkowity. Jest to to samo, co indeks tablicy, ale w przypadku łańcucha lub słownika nie będzie zbyt przydatne. Aby uzyskać rzeczywisty indeks wraz z każdym elementem, możesz użyć zip
:
let actualIndexAndNum: [String] = zip(numbers.indices, numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
W przypadku korzystania z wyliczonej sekwencji z reduce
nie będzie można oddzielić indeksu i elementu w krotce, ponieważ w sygnaturze metody masz już kumulującą / bieżącą krotkę. Zamiast tego musisz użyć .0
i .1
na drugim parametrze reduce
zamknięcia:
let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56
Swift 3.0 i nowsze
Ponieważ składnia Swift 3.0 jest zupełnie inna.
Możesz również użyć krótkiej składni / inline, aby odwzorować tablicę w słowniku:
let numbers = [7, 8, 9, 10]
let array: [(Int, Int)] = numbers.enumerated().map { ($0, $1) }
// ^ ^
// index element
To daje:
[(0, 7), (1, 8), (2, 9), (3, 10)]
numbers.enumerate().map { (index, element) in ...
.reduce
poenumerate()
lubzip
.enumerate
jest terazenumerated
Ponieważ
Swift 2.1
napisałem następną funkcję:A potem użyj tego w ten sposób:
źródło
W Swift 3, gdy masz obiekt, który jest zgodny z
Sequence
protokołem i chcesz połączyć każdy element wewnątrz niego z jego indeksem, możesz użyćenumerated()
metody method.Na przykład:
Dlatego w najprostszym przypadku możesz zaimplementować algorytm Luhna w Playground w następujący sposób:
Jeśli zaczniesz od a
String
, możesz to zaimplementować w następujący sposób:Jeśli chcesz powtórzyć te operacje, możesz refaktoryzować swój kod na rozszerzenie:
Lub w bardzo zwięzły sposób:
źródło
Oprócz przykładu Nate Cooka
map
, możesz również zastosować to zachowanie doreduce
.Zauważ, że
EnumerateSequence
przekazany do zamknięcia, ponieważenumerated
nie może być rozłożony w sposób zagnieżdżony, dlatego elementy krotki muszą zostać zdekomponowane wewnątrz zamknięcia (tj.enumerated.index
).źródło
To jest działające rozszerzenie CollectionType dla Swift 2.1 używające rzutów i ponownych rzutów:
Wiem, że nie o to prosiłeś, ale rozwiązuje twój problem. Możesz wypróbować tę szybką metodę Luhna 2.0 bez rozszerzania czegokolwiek:
źródło