Gibt es in Swift eine clevere Möglichkeit, die Methoden höherer Ordnung für Array zu verwenden, um die 5 ersten Objekte zurückzugeben? Die obj-c-Methode bestand darin, einen Index zu speichern und den inkrementierenden Index des Arrays bis zum Wert 5 zu durchlaufen und das neue Array zurückzugeben. Gibt es eine Möglichkeit, dies zu tun filter
, map
oder reduce
?
178
n
Elemente eines zurückzugebenArray
.Antworten:
Der mit Abstand beste Weg, um die ersten N Elemente eines Swift-Arrays zu erhalten, ist
prefix(_ maxLength: Int)
:Dies hat den Vorteil, dass die Grenzen sicher sind. Wenn die Anzahl, an die Sie übergeben,
prefix
größer als die Anzahl der Arrays ist, wird nur das gesamte Array zurückgegeben.HINWEIS: Wie in den Kommentaren erwähnt, wird
Array.prefix
tatsächlich ein zurückgegebenArraySlice
, keinArray
. In den meisten Fällen sollte dies keinen Unterschied machen. Wenn Sie das Ergebnis jedoch einemArray
Typ zuweisen oder an eine Methode übergeben müssen, die einenArray
Parameter erwartet, müssen Sie das Ergebnis in einenArray
Typ erzwingen :let first5 = Array(someArray.prefix(5))
quelle
dropFirst
unddropLast
, könnte genauso guttakeFirst
und habentakeLast
.first5
ein Array sein müssen, schreibenlet first5 = Array(someArray.prefix(5))
video = video.prefix(5)
in Xcode 7.2 führt zu KompilierungsfehlerCannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
ist möglicherweise nur Swift 2.x (ich erinnere mich nicht, ob es in 1.x war), aber es existiert sicherlich in jedem Betriebssystem, das Swift 2.x unterstützt, nämlich iOS 7 und höher. Die Verfügbarkeit von Swift-Funktionen wird durch Swift-Versionen bestimmt, nicht durch iOS-Versionen.Update: Es besteht jetzt die Möglichkeit
prefix
, die ersten n Elemente eines Arrays abzurufen. Überprüfen @ mluisbrown Antwort auf eine Erklärung , wie Präfix zu verwenden.Original Antwort: Sie können es einfach ohne
filter
,map
oderreduce
nur um eine Reihe von Array Rückkehr:quelle
n
Elemente aus einem Swift-Array möchten , können Sie dies tun,wholeArray.prefix(n)
was den zusätzlichen Vorteil hat, dass die Grenzen sicher sind. Wennn
größer als das Array ist, wirdprefix
das gesamte Array zurückgegeben.wholeArray
nicht mehr Elemente hat alsn
prefix
.Mit Swift 5 können Sie je nach Bedarf einen der 6 folgenden Spielplatzcodes auswählen , um Ihr Problem zu lösen.
# 1. Mit
subscript(_:)
Index# 2. Mit
prefix(_:)
MethodeKomplexität: O (1) wenn die Sammlung übereinstimmt
RandomAccessCollection
; sonst O ( k ), wobei k die Anzahl der Elemente ist, die vom Beginn der Sammlung an ausgewählt werden sollen.Apple sagt für
prefix(_:)
:#3. Mit
prefix(upTo:)
MethodeKomplexität: O (1)
Apple sagt für
prefix(upTo:)
:# 4. Mit
prefix(through:)
Methode# 5. Verwenden von
removeSubrange(_:)
MethodeKomplexität: O ( n ), wobei n die Länge der Sammlung ist.
# 6. Verwenden von
dropLast(_:)
MethodeKomplexität: O (1) wenn die Sammlung übereinstimmt
RandomAccessCollection
; andernfalls O ( k ), wobei k die Anzahl der zu löschenden Elemente ist.quelle
quelle
SWIFT 4
Eine andere Lösung:
Eine einfache Inline-Lösung, die nicht abstürzt, wenn Ihr Array zu kurz ist
Funktioniert aber gut damit.
Normalerweise stürzt dies ab, wenn Sie dies tun:
quelle
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Um die ersten 5 Elemente eines Arrays zu erhalten, müssen Sie lediglich das betreffende Array in Scheiben schneiden. In Swift machen Sie es so:
array[0..<5]
.Um die Auswahl der N ersten Elemente eines Arrays etwas funktionaler und verallgemeinerbarer zu gestalten, können Sie eine Erweiterungsmethode dafür erstellen. Zum Beispiel:
quelle
Ich habe Markus 'Antwort leicht geändert, um sie für die neueste Swift-Version zu aktualisieren, da
var
Ihre Methodendeklaration nicht mehr unterstützt wird:quelle
Swift 4
Um die ersten N Elemente eines Swift-Arrays zu erhalten, können Sie Folgendes verwenden
prefix(_ maxLength: Int)
:quelle
Swift 4 mit gespeicherten Array-Typen
quelle
Update für Swift 4:
Für schnelle 3:
quelle
Schlicht und einfach
quelle
Für ein Array von Objekten können Sie eine Erweiterung aus Sequence erstellen.
Verwendung:
quelle