Czy istnieje funkcja, której można użyć do iteracji po tablicy i posiadania zarówno indeksu, jak i elementu, takich jak wyliczenie Pythona?
for index, element in enumerate(list):
...
arrays
swift
enumeration
myśliciel 3
źródło
źródło
enumerate
?enumerating
na Swift 4. Ekscytujące!for (index, element) in
podczas używaniaenumerated
wprowadza w błąd. powinien byćfor (offset, element) in
Swift 5 zapewnia metodę o nazwie
enumerated()
dlaArray
.enumerated()
ma następującą deklarację:W najprostszych przypadkach możesz użyć
enumerated()
pętli for. Na przykład:Zauważ jednak, że nie jesteś ograniczony do używania
enumerated()
z pętlą for. W rzeczywistości, jeśli planujesz używaćenumerated()
pętli for dla czegoś podobnego do następującego kodu, robisz to źle:Szybszym sposobem na to jest:
Alternatywnie możesz również używać
enumerated()
zmap
:Co więcej, chociaż ma pewne ograniczenia ,
forEach
może być dobrym zamiennikiem pętli for:Korzystając z
enumerated()
imakeIterator()
, możesz nawet iterować ręcznie na swoimArray
. Na przykład:źródło
enumerate
?Począwszy od wersji Swift 2, funkcję wyliczającą należy wywołać w kolekcji w następujący sposób:
źródło
Znalazłem tę odpowiedź, szukając sposobu, aby to zrobić za pomocą Słownika , i okazuje się, że dość łatwo ją dostosować, wystarczy podać krotkę dla elementu.
źródło
Możesz po prostu użyć pętli wyliczenia, aby uzyskać pożądany wynik:
Swift 2:
Swift 3 i 4:
Możesz też po prostu przejść przez pętlę for, aby uzyskać ten sam wynik:
Mam nadzieję, że to pomoże.
źródło
Podstawowe wyliczenie
lub z Swift 3 ...
Wylicz, Filtruj i Mapuj
Jednak najczęściej używam wyliczenia w połączeniu z mapą lub filtrem. Na przykład z operowaniem na kilku tablicach.
W tej tablicy chciałem filtrować nieparzyste lub nawet indeksowane elementy i konwertować je z Ints na Doubles. W ten sposób
enumerate()
dostajesz indeks i element, a następnie filtr sprawdza indeks, a na koniec, aby pozbyć się wynikowej krotki, mapuję go tylko na element.źródło
Korzystanie z
.enumerate()
działa, ale nie zapewnia prawdziwego indeksu elementu; zapewnia tylko wartość Int zaczynającą się od 0 i zwiększającą się o 1 dla każdego kolejnego elementu. Jest to zwykle nieistotne, ale istnieje ryzyko nieoczekiwanego zachowania w przypadku użycia z tymArraySlice
typem. Weź następujący kod:Jest to nieco wymyślony przykład i nie jest to częsty problem w praktyce, ale nadal uważam, że warto wiedzieć, że tak się może stać.
źródło
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
Tak, dlatego nazywa się to wyliczeniem . Ponadto plasterek nie jest tablicą, więc nic dziwnego, że zachowuje się inaczej. Tutaj nie ma błędu - wszystko jest zgodne z projektem. :)filter
pierwszego?Począwszy od Swift 3, tak jest
źródło
Aby uzyskać kompletność, możesz po prostu iterować indeksy tablicowe i użyć indeksu dolnego, aby uzyskać dostęp do elementu o odpowiednim indeksie:
Korzystanie z forEach
Przy użyciu
enumerated()
metody zbierania . Zauważ, że zwraca kolekcję krotek wrazoffset
zelement
:za pomocą forEach:
Te zostaną wydrukowane
Jeśli potrzebujesz indeksu tablicy (a nie przesunięcia) i jego elementu, możesz rozszerzyć kolekcję i stworzyć własną metodę uzyskiwania indeksowanych elementów:
Inną możliwą implementacją sugerowaną przez Alexa jest skompresowanie indeksów kolekcji za pomocą jej elementów:
Testowanie:
Spowoduje to [rint
źródło
enumeratedIndices
, zapętlając zzip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Przy okazji nie podoba mi się nazwa, którą wybrałem,indexedElements
może lepiej opisać, co robifor
pętla działa, ale takżezip(self.indices, self) .forEach(body)
forEach
robi pętlę for za kulisami. Wolę zachować prostotę 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) } } }
Oto formuła pętli wyliczenia:
więcej szczegółów można sprawdzić tutaj .
źródło
Osobiście wolę
forEach
metodę:Możesz także użyć krótkiej wersji:
źródło
Xcode 8 i Swift 3: Array można wyliczyć za pomocą
tempArray.enumerated()
Przykład:
konsola:
źródło
Dla tych, którzy chcą korzystać
forEach
.Szybki 4
Lub
źródło
Do tego, co chcesz zrobić, powinieneś użyć
enumerated()
metody na tablicy :źródło
W celu zaimplementowania tej funkcji wywołaliśmy funkcję wyliczającą. lubić
źródło