Czy w języku Swift istnieje sprytny sposób na użycie metod wyższego rzędu w Array do zwrócenia 5 pierwszych obiektów? Sposób według obj-c polegał na zapisaniu indeksu i wykonaniu pętli for przez tablicę, zwiększając indeks do wartości 5 i zwracając nową tablicę. Czy istnieje sposób to zrobić z filter
, map
albo reduce
?
179
n
elementów plikuArray
.Odpowiedzi:
Zdecydowanie najładniejszym sposobem uzyskania pierwszych N elementów tablicy Swift jest użycie
prefix(_ maxLength: Int)
:Ma to tę zaletę, że jest bezpieczny. Jeśli liczba, do której przekazujesz,
prefix
jest większa niż liczba tablic, po prostu zwraca całą tablicę.UWAGA: jak wskazano w komentarzach, w
Array.prefix
rzeczywistości zwraca anArraySlice
, a nieArray
. W większości przypadków nie powinno to robić różnicy, ale jeśli chcesz przypisać wynik doArray
typu lub przekazać go do metody, która oczekujeArray
parametru, będziesz musiał wymusić wynik naArray
typ:let first5 = Array(someArray.prefix(5))
źródło
dropFirst
idropLast
, więc równie dobrze mógłby miećtakeFirst
itakeLast
.first5
być tablicą, po prostu napiszlet first5 = Array(someArray.prefix(5))
video = video.prefix(5)
w Xcode 7.2 powoduje błąd kompilacjiCannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
jest prawdopodobnie tylko Swift 2.x (nie pamiętam, czy był w 1.x), ale z pewnością istnieje w każdym systemie operacyjnym obsługującym Swift 2.x, czyli iOS 7 i nowsze. Dostępność funkcji Swift jest określana przez wersje Swift, a nie wersje iOS.Aktualizacja: istnieje teraz możliwość użycia
prefix
do pobrania pierwszych n elementów tablicy. Sprawdź odpowiedź @ mluisbrown, aby uzyskać wyjaśnienie, jak używać prefiksu.Oryginalny Odpowiedź: Można to zrobić bardzo łatwo, bez
filter
,map
lubreduce
po prostu powrocie zakres swojej tablicy:źródło
n
elementów z tablicy Swift, możesz to zrobić,wholeArray.prefix(n)
co ma dodatkową zaletę w postaci bezpieczeństwa granic. Jeślin
jest większy niż rozmiar tablicy,prefix
zwraca całą tablicę.wholeArray
nie ma więcej elementów niżn
prefix
.Dzięki Swift 5, w zależności od potrzeb, możesz wybrać jeden z 6 poniższych kodów Playground , aby rozwiązać problem.
# 1. Korzystanie z
subscript(_:)
indeksu dolnego# 2. Korzystanie z
prefix(_:)
metodyZłożoność: O (1) jeśli kolekcja jest zgodna
RandomAccessCollection
; w przeciwnym razie O ( k ), gdzie k to liczba elementów do wybrania od początku kolekcji.Apple stwierdza
prefix(_:)
:# 3. Korzystanie z
prefix(upTo:)
metodyZłożoność: O (1)
Apple stwierdza
prefix(upTo:)
:# 4. Korzystanie z
prefix(through:)
metody# 5. Korzystanie z
removeSubrange(_:)
metodyZłożoność: O ( n ), gdzie n jest długością kolekcji.
# 6. Korzystanie z
dropLast(_:)
metodyZłożoność: O (1) jeśli kolekcja jest zgodna
RandomAccessCollection
; w przeciwnym razie O ( k ), gdzie k to liczba elementów do usunięcia.źródło
źródło
SWIFT 4
Inne rozwiązanie:
Proste rozwiązanie wbudowane, które nie ulegnie awarii, jeśli twoja tablica jest zbyt krótka
Ale działa dobrze z tym.
Zwykle to się zawiesiło, gdybyś zrobił to:
źródło
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Aby uzyskać pierwsze 5 elementów tablicy, wystarczy wyciąć tę tablicę. W Swift, robisz to tak:
array[0..<5]
.Aby sprawić, że wybieranie N pierwszych elementów tablicy będzie nieco bardziej funkcjonalne i możliwe do uogólnienia, możesz utworzyć metodę rozszerzającą, aby to zrobić. Na przykład:
źródło
Nieznacznie zmieniłem odpowiedź Markusa, aby zaktualizować ją do najnowszej wersji Swift, ponieważ
var
wewnątrz deklaracji metody nie jest już obsługiwana:źródło
Szybki 4
Aby uzyskać pierwsze N elementów tablicy Swift, możesz użyć
prefix(_ maxLength: Int)
:źródło
Swift 4 z zapisywaniem typów tablic
źródło
Aktualizacja dla Swift 4:
Dla Swift 3:
źródło
Jasne i proste
źródło
Dla tablicy obiektów możesz utworzyć rozszerzenie z Sequence.
Stosowanie:
źródło