Dalam Swift, apakah ada cara pintar menggunakan metode urutan lebih tinggi pada Array untuk mengembalikan 5 objek pertama? Cara objektif melakukannya adalah menyimpan indeks, dan untuk-loop melalui indeks kenaikan array sampai 5 dan mengembalikan array baru. Apakah ada cara untuk melakukan ini filter
, map
atau reduce
?
179
n
elemen pertama dari sebuahArray
.Jawaban:
Sejauh ini cara paling rapi untuk mendapatkan elemen N pertama dari array Swift adalah menggunakan
prefix(_ maxLength: Int)
:Ini memiliki manfaat menjadi batas aman. Jika jumlah yang Anda berikan
prefix
lebih besar dari jumlah array maka itu hanya mengembalikan seluruh array.CATATAN: seperti yang ditunjukkan dalam komentar,
Array.prefix
sebenarnya mengembalikan sebuahArraySlice
, bukan sebuahArray
. Dalam kebanyakan kasus ini seharusnya tidak membuat perbedaan tetapi jika Anda perlu menetapkan hasil ke suatuArray
jenis atau meneruskannya ke metode yang mengharapkanArray
param Anda perlu memaksa hasilnya menjadi suatuArray
jenis:let first5 = Array(someArray.prefix(5))
sumber
dropFirst
dandropLast
, mungkin juga memilikitakeFirst
dantakeLast
.first5
sebuah array, cukup tulislet first5 = Array(someArray.prefix(5))
video = video.prefix(5)
di Xcode 7.2 menghasilkan kesalahan kompilasiCannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
mungkin hanya Swift 2.x saja (saya tidak ingat apakah itu di 1.x), tetapi sudah pasti ada di OS yang mendukung Swift 2.x, yaitu iOS 7 ke atas. Ketersediaan fitur Swift ditentukan oleh rilis Swift, bukan versi iOS.Pembaruan: Sekarang ada kemungkinan untuk menggunakan
prefix
untuk mendapatkan elemen pertama dari sebuah array. Periksa jawaban @ mluisbrown untuk penjelasan cara menggunakan awalan.Jawaban Asli: Anda dapat melakukannya dengan sangat mudah tanpa
filter
,map
ataureduce
hanya dengan mengembalikan rentang array Anda:sumber
n
item pertama dari array Swift yang dapat Anda lakukanwholeArray.prefix(n)
yang memiliki manfaat tambahan sebagai batas aman. Jikan
lebih besar dari ukuran arrayprefix
mengembalikan seluruh array.wholeArray
tidak memiliki lebih banyak elemen darin
prefix
.Dengan Swift 5, sesuai dengan kebutuhan Anda, Anda dapat memilih salah satu dari 6 kode Playground berikut untuk menyelesaikan masalah Anda.
# 1. Menggunakan
subscript(_:)
subskrip# 2. Menggunakan
prefix(_:)
metodeKompleksitas: O (1) jika koleksi sesuai dengan
RandomAccessCollection
; jika tidak, O ( k ), di mana k adalah jumlah elemen yang harus dipilih dari awal koleksi.Negara Apple untuk
prefix(_:)
:# 3. Menggunakan
prefix(upTo:)
metodeKompleksitas: O (1)
Negara Apple untuk
prefix(upTo:)
:# 4 Menggunakan
prefix(through:)
metode# 5 Menggunakan
removeSubrange(_:)
metodeKompleksitas: O ( n ), di mana n adalah panjang koleksi.
# 6. Menggunakan
dropLast(_:)
metodeKompleksitas: O (1) jika koleksi sesuai dengan
RandomAccessCollection
; jika tidak, O ( k ), di mana k adalah jumlah elemen untuk dijatuhkan.sumber
sumber
SWIFT 4
Solusi berbeda:
Solusi inline mudah yang tidak akan macet jika array Anda terlalu pendek
Tetapi bekerja dengan baik dengan ini.
Biasanya ini akan macet jika Anda melakukan ini:
sumber
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Untuk mendapatkan 5 elemen pertama dari array, yang perlu Anda lakukan adalah mengiris array yang dimaksud. Dalam Swift, Anda melakukannya seperti ini:
array[0..<5]
.Untuk membuat memilih elemen N pertama dari array sedikit lebih fungsional dan dapat digeneralisasikan, Anda bisa membuat metode ekstensi untuk melakukannya. Misalnya:
sumber
Saya sedikit mengubah jawaban Markus untuk memperbaruinya untuk versi Swift terbaru, karena
var
di dalam deklarasi metode Anda tidak lagi didukung:sumber
Cepat 4
Untuk mendapatkan elemen N pertama dari array Swift, Anda dapat menggunakan
prefix(_ maxLength: Int)
:sumber
Swift 4 dengan menyimpan tipe array
sumber
Pembaruan untuk swift 4:
Untuk cepat 3:
sumber
Polos & Sederhana
sumber
Untuk array objek, Anda dapat membuat ekstensi dari Sequence.
Pemakaian:
sumber