NSArray
dan NSMutableArray
menyediakan metode untuk memfilter konten array. NSArray
menyediakan filteredArrayUsingPredicate: yang mengembalikan larik baru yang berisi objek di penerima yang cocok dengan predikat yang ditentukan.NSMutableArray
Menambahkan filterUsingPredicate: yang mengevaluasi isi penerima terhadap predikat tertentu dan daun hanya benda pertandingan itu. Metode ini diilustrasikan dalam contoh berikut.
NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];
NSPredicate *bPredicate =
[NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
NSArray *beginWithB =
[array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Bill", @"Ben" }.
NSPredicate *sPredicate =
[NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
[array filteredArrayUsingPredicate:sPredicate];
// array now contains { @"Chris", @"Melissa" }
Ada banyak cara untuk melakukan ini, tetapi sejauh ini yang paling rapi pasti menggunakan
[NSPredicate predicateWithBlock:]
:Saya pikir itu sesingkat yang didapat.
Cepat:
Bagi mereka yang bekerja dengan
NSArray
s di Swift, Anda mungkin lebih suka versi yang lebih ringkas ini:filter
hanyalah sebuah metodeArray
(NSArray
secara implisit dihubungkan dengan SwiftArray
). Dibutuhkan satu argumen: penutupan yang mengambil satu objek dalam array dan mengembalikan aBool
. Dalam closure Anda, cukup kembalikantrue
objek apa pun yang Anda inginkan dalam array yang difilter.sumber
NSPredicate predicateWithBlock:
API.bindings
dapat berisi pengikatan variabel untuk template.Berdasarkan jawaban dari Clay Bridges, berikut adalah contoh pemfilteran menggunakan blok (ubah
yourArray
ke nama variabel array Anda dantestFunc
ke nama fungsi pengujian Anda):sumber
filteredArrayUsingPredicate
lebih ramping, fakta bahwa Anda tidak menggunakan predikat apa pun mengaburkan tujuannya.Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'NSIndexSet * _Nonnull' is disallowed with ARC
... NSIndexSets mengharapkanindexOfObjectPassingTest
sebagai penggantiindexesOfObjectsPassingTest
. Mudah terlewatkan, tetapi perbedaan besar :)Jika Anda menggunakan OS X 10.6 / iOS 4.0 atau yang lebih baru, Anda mungkin lebih baik menggunakan blok daripada NSPredicate. Lihat
-[NSArray indexesOfObjectsPassingTest:]
atau tulis kategori Anda sendiri untuk menambahkan cara-select:
atau-filter:
metode ( contoh ).Ingin orang lain menulis kategori itu, mengujinya, dll.? Lihat BlocksKit ( dokumen array ). Dan masih banyak lagi contoh yang bisa ditemukan, katakanlah, mencari misalnya "kategori blok nsarray pilih" .
sumber
Dengan asumsi bahwa semua objek Anda berjenis serupa, Anda dapat menambahkan metode sebagai kategori kelas dasarnya yang memanggil fungsi yang Anda gunakan untuk kriteria Anda. Kemudian buat objek NSPredicate yang mengacu pada metode itu.
Dalam beberapa kategori, tentukan metode Anda yang menggunakan fungsi Anda
Lalu di mana pun Anda akan memfilter:
Tentu saja, jika fungsi Anda hanya membandingkan dengan properti yang dapat dijangkau dari dalam kelas Anda, mungkin akan lebih mudah untuk mengubah kondisi fungsi menjadi string predikat.
sumber
NSPredicate
cara NeXTSTEP ini membangun kondisi untuk menyaring koleksi (NSArray
,NSSet
,NSDictionary
).Misalnya pertimbangkan dua larik
arr
danfilteredarr
:filteredarr pasti akan memiliki item yang berisi karakter c saja.
agar mudah diingat orang-orang yang memiliki latar belakang sql kecil
1) pilih * dari tbl -> koleksi
2) kolom1 seperti '% a%' ->
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3) pilih * dari tbl dimana kolom1 seperti '% a%' ->
saya harap ini membantu
sumber
NSArray + Xh
NSArray + Xm
Anda dapat mendownload kategori ini di sini
sumber
Lihat perpustakaan ini
https://github.com/BadChoice/Collection
Muncul dengan banyak fungsi array yang mudah untuk tidak pernah menulis loop lagi
Jadi Anda bisa melakukan:
atau
sumber
Cara terbaik dan mudah adalah dengan membuat metode ini Dan Lewati Array Dan Nilai:
sumber