Di Swift, bagaimana saya bisa memeriksa apakah ada elemen dalam array? Xcode tidak memiliki saran untuk contain
, include
, atau has
, dan pencarian cepat melalui buku muncul apa-apa. Adakah yang tahu cara memeriksa ini? Saya tahu bahwa ada metode find
yang mengembalikan nomor indeks, tetapi apakah ada metode yang mengembalikan boolean seperti ruby #include?
?
Contoh yang saya butuhkan:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
if find(elements, 5) != nil { }
tidak cukup baikJawaban:
Swift 2, 3, 4, 5:
contains()
adalah metode ekstensi protokol dariSequenceType
(untuk urutanEquatable
elemen) dan bukan metode global dalam rilis sebelumnya.Catatan:
contains()
Metode ini mensyaratkan bahwa elemen-elemen urutan mengadopsiEquatable
protokol, membandingkan misalnya jawaban Andrews .NSObject
subclass maka Anda harus menimpanya,isEqual:
lihat NSObject subclass di Swift: hash vs hashValue, isEqual vs == .contains()
metode lain - yang lebih umum - yang tidak memerlukan elemen yang dapat disetarakan dan menggunakan predikat sebagai argumen, lihat misalnya Singkatan untuk menguji apakah suatu objek ada dalam array untuk Swift? .Versi cepat Swift:
sumber
Equatable
protokol (yangDictionary<String, AnyObject>
tidak). Ada varian keduacontains()
yang mengambil predikat (bandingkan stackoverflow.com/questions/29679486/... ) mungkin Anda dapat menggunakannya, misalnyaif contains(array, { $0 == dict } ) ...
Bagi mereka yang datang ke sini mencari menemukan dan menghapus objek dari array:
Cepat 1
Cepat 2
Cepat 3, 4
Cepat 5.2
sumber
Gunakan ekstensi ini:
Digunakan sebagai:
Diperbarui untuk Swift 2/3
Perhatikan bahwa pada Swift 3 (atau bahkan 2), ekstensi tidak lagi diperlukan karena
contains
fungsi global telah dibuat menjadi sepasang metode ekstensi aktifArray
, yang memungkinkan Anda melakukan salah satu dari:sumber
Jika Anda memeriksa apakah instance kelas kustom atau struct terkandung dalam array, Anda harus mengimplementasikan protokol Equatable sebelum Anda dapat menggunakan .contains (myObject).
Sebagai contoh:
maka kamu bisa melakukan:
Tip : Override == harus di tingkat global, bukan di dalam kelas / struct Anda
sumber
Saya menggunakan filter.
Jika mau, Anda bisa mengompresnya ke
Semoga itu bisa membantu.
Pembaruan untuk Swift 2
Hore untuk implementasi standar!
sumber
(Swift 3)
Periksa apakah ada elemen dalam array (memenuhi beberapa kriteria), dan jika demikian, lanjutkan bekerja dengan elemen tersebut pertama
Jika tujuannya adalah:
Maka alternatif untuk
contains(_:)
sebagai cetak biruSequence
adalahfirst(where:)
dariSequence
:Dalam contoh yang dibuat-buat ini, penggunaannya mungkin tampak konyol, tetapi sangat berguna jika permintaan array tipe elemen non-fundamental untuk keberadaan elemen yang memenuhi beberapa persyaratan. Misalnya
Setiap operasi berantai menggunakan
.filter { ... some condition }.first
dapat diganti dengan baikfirst(where:)
. Yang terakhir menunjukkan niat yang lebih baik, dan memiliki keunggulan kinerja lebih dari peralatan yang tidak malas.filter
, karena ini akan melewati array penuh sebelum mengekstraksi elemen (mungkin) pertama yang melewati filter.Periksa apakah ada elemen dalam array (memenuhi beberapa kriteria), dan jika demikian, hapus elemen pertama
Komentar di bawah pertanyaan:
Kasus penggunaan yang mirip dengan yang di atas adalah untuk menghapus elemen pertama yang memenuhi predikat yang diberikan. Untuk melakukannya,
index(where:)
metodeCollection
(yang sudah tersedia untuk koleksi array) dapat digunakan untuk menemukan indeks elemen pertama yang memenuhi predikat, kemudian indeks dapat digunakan denganremove(at:)
metodeArray
to (mungkin; mengingat bahwa itu ada) hapus elemen itu.Atau, jika Anda ingin menghapus elemen dari array dan bekerja dengannya , terapkan metode
Optional
: smap(_:)
untuk bersyarat (untuk.some(...)
kembali dariindex(where:)
) gunakan hasil dariindex(where:)
untuk menghapus dan menangkap elemen yang dihapus dari array (dalam klausa penjilidan opsional) .Perhatikan bahwa dalam contoh yang dibuat di atas anggota array adalah tipe nilai sederhana (
String
instance), jadi menggunakan predikat untuk menemukan anggota tertentu agak terlalu mematikan, karena kami mungkin hanya menguji kesetaraan menggunakanindex(of:)
metode yang lebih sederhana seperti yang ditunjukkan pada jawaban @ DogCoffee . Jika menerapkan pendekatan temukan-dan-hilangkan di atas untukPerson
contoh, bagaimanapun, menggunakanindex(where:)
dengan predikat adalah tepat (karena kami tidak lagi menguji kesetaraan tetapi untuk memenuhi predikat yang disediakan).sumber
Cara termudah untuk mencapai ini adalah dengan menggunakan filter pada array.
result
akan memiliki elemen yang ditemukan jika ada dan akan kosong jika elemen tidak ada. Jadi cukup memeriksa jikaresult
kosong akan memberi tahu Anda apakah ada elemen dalam array. Saya akan menggunakan yang berikut ini:sumber
let result = elements.filter { $0==5 }.first
harus memenuhi apa yang Anda cari.Swift 4/5
Cara lain untuk mencapai ini adalah dengan fungsi filter
sumber
Pada Swift 2.1 NSArrays memiliki
containsObject
yang dapat digunakan seperti:sumber
Untuk berjaga-jaga kalau-kalau ada yang mencoba mencari apakah
indexPath
ada di antara yang terpilih (seperti dalamUICollectionView
atauUITableView
cellForItemAtIndexPath
fungsi):sumber
Himpunan
Periksa keberadaan elemen
Dapatkan indeks elemen
Dapatkan jumlah elemen
sumber
Ini adalah ekstensi kecil saya, saya baru saja menulis untuk memeriksa apakah array delegasi saya berisi objek delegasi atau tidak ( Swift 2 ). :) Ini juga berfungsi dengan tipe nilai seperti pesona.
Jika Anda memiliki ide bagaimana mengoptimalkan kode ini, daripada hanya beri tahu saya.
sumber
jika pengguna menemukan elemen array tertentu maka gunakan kode di bawah ini sama dengan nilai integer.
sumber
Cepat
Jika Anda tidak menggunakan objek maka Anda dapat menggunakan kode ini untuk memuat.
Jika Anda menggunakan NSObject Class dengan cepat. Variabel ini sesuai dengan kebutuhan saya. Anda dapat memodifikasi untuk kebutuhan Anda.
Ini untuk tipe data yang sama.
Jika Anda ingin jenis AnyObject.
Kondisi penuh
sumber
bagaimana dengan menggunakan tabel hash untuk pekerjaan itu, seperti ini?
pertama, membuat fungsi generik "peta hash", memperluas protokol Sequence.
Ekstensi ini akan berfungsi selama item dalam array sesuai dengan Hashable, seperti bilangan bulat atau string, berikut adalah penggunaannya ...
Tapi untuk sekarang, mari kita fokus memeriksa apakah elemennya ada di dalam array.
sumber
Swift 4.2 +
Anda dapat dengan mudah memverifikasi instance Anda berupa array atau tidak dengan fungsi berikut.
Bahkan Anda dapat mengaksesnya sebagai berikut. Anda akan menerima
nil
jika objek tidak berupa array.sumber