Apakah Swift memiliki sesuatu seperti _.findWhere di Underscore.js?
Saya memiliki array tipe struct T
dan ingin memeriksa apakah array berisi objek struct yang name
propertinya sama dengan Foo
.
Sudah mencoba menggunakan find()
dan filter()
tetapi mereka hanya bekerja dengan tipe primitif, misalnya String
atau Int
. Melempar kesalahan tentang tidak mematuhi Equitable
protokol atau sesuatu seperti itu.
Jawaban:
FWIW, jika Anda tidak ingin menggunakan fungsi atau ekstensi khusus, Anda dapat:
Ini menghasilkan
name
array pertama, lalufind
darinya.Jika Anda memiliki array besar, Anda mungkin ingin melakukan:
atau mungkin:
sumber
SWIFT 5
Periksa apakah ada elemen
Dapatkan elemennya
Dapatkan elemen dan offsetnya
Dapatkan offsetnya
sumber
$0.name == "foo"
melakukan satu operasi dan$0.name == "boo"
melakukan operasi lainAnda dapat menggunakan
index
metode yang tersediaArray
dengan predikat ( lihat dokumentasi Apple di sini ).Untuk contoh spesifik Anda, ini akan menjadi:
Swift 5.0
Swift 3.0
Swift 2.0
sumber
Cepat 3
Jika Anda perlu menggunakan objek:
(Jika Anda memiliki lebih dari satu objek bernama "Foo" maka
first
akan mengembalikan objek pertama dari pemesanan yang tidak ditentukan)sumber
array.first {$0.name == "Foo"}
array.first(where: {$0.name == "Foo"})
Anda bisa memfilter array dan kemudian hanya memilih elemen pertama, seperti yang ditunjukkan pada Find Object with Property in Array .
Atau Anda menentukan ekstensi khusus
Contoh penggunaan:
Di Swift 3 Anda dapat menggunakan
first(where:)
metode yang ada (seperti yang disebutkan dalam komentar ):sumber
array.lazy.filter( predicate ).first
? Seberapa efisien. Lazy untuk array kecil?filter
selaluO(n)
sedangkan difindFirstMatching
dalamnya hanya dalam skenario terburuk (ketika elemen yang Anda cari adalah yang terakhir atau tidak dalam array sama sekali). 2.filter
menciptakan array yang benar-benar baru dari elemen yang difilter sementara yangfindFirstMatching
baru saja mengembalikan elemen yang diminta.Swift 3.0
Cepat 2.1
Pemfilteran dalam properti objek sekarang didukung di swift 2.1. Anda dapat memfilter array Anda berdasarkan nilai struct atau kelas di sini sebagai contoh
ATAU
sumber
Swift 4 ,
Cara lain untuk mencapai ini menggunakan fungsi filter,
sumber
Cepat 3
Anda dapat menggunakan indeks (di mana :) di Swift 3
contoh
sumber
$0.name == "Foo"
?Cepat 3
sumber
Cepat 2 atau lebih baru
Anda dapat menggabungkan
indexOf
danmap
menulis fungsi "find element" dalam satu baris.Menggunakan
filter
+first
terlihat lebih bersih, tetapifilter
mengevaluasi semua elemen dalam array.indexOf
+map
terlihat rumit, tetapi evaluasi berhenti ketika kecocokan pertama dalam array ditemukan. Kedua pendekatan memiliki pro dan kontra.sumber
Gunakan
contains
:Atau Anda bisa mencoba apa yang Martin tunjukkan, di komentar dan
filter
coba lagi: Temukan Objek dengan Properti di Array .sumber
item
ini memiliki jenis yang sama dengan item dalam array. Namun, yang saya miliki hanyalah sebuah judul dariview.annotation.title
. Saya perlu membandingkan item dalam array dengan judul ini.if contains(yourArray, view.annotation.title) { // code goes here }
.Cara lain untuk mendapatkan akses ke array.index (dari: Any) adalah dengan mendeklarasikan objek Anda
sumber
Gunakan Dollar yang merupakan Lo-Dash atau Underscore.js untuk Swift:
sumber
Swift 3:
Anda dapat menggunakan fungsionalitas bawaan Swift untuk menemukan objek khusus dalam Array.
Pertama, Anda harus memastikan objek kustom Anda sesuai dengan: Protokol yang setara .
Dengan fungsi Equatable yang ditambahkan ke objek Anda, Swift sekarang akan menunjukkan kepada Anda properti tambahan yang dapat Anda gunakan pada array:
sumber
Untuk Swift 3,
sumber
Misalnya, jika kami memiliki array angka:
Kami dapat menemukan nomor ganjil pertama seperti ini:
Itu akan mengirim kembali 4 sebagai bilangan bulat opsional, karena angka ganjil pertama (9) adalah pada indeks empat.
sumber