序言
NSPredicate 學(xué)名叫謂詞邏輯。提供一個(gè)篩選條件給它,它就可以在最短的時(shí)間內(nèi)篩選出你想要的。簡直快到?jīng)]朋友贩挣,甩for循環(huán)幾條街。
幾種常見的處理數(shù)據(jù)處理
- 獲取字符串?dāng)?shù)組中長度大于3的元素
//字符串?dāng)?shù)組
NSArray *array = @[@"mally", @"lisa", @"shally"];
//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length <= 4"];
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
length 是哪里來的没酣?
數(shù)組中所有元素都是字符串王财,也就是NSString,而NSString 具有l(wèi)ength這個(gè)屬性裕便。如果有其他需求搪搏,可以查看NSString 的屬性列表,根據(jù)需求寫篩選條件闪金。
執(zhí)行過程是怎樣的?
篩選器(NSPredicate)會(huì)獲取到數(shù)組中的每一個(gè)元素(這里是字符串)论颅,執(zhí)行:self.length<=4 這個(gè)判斷條件哎垦,self是當(dāng)前執(zhí)行判斷的某個(gè)元素(這里是某個(gè)字符串)。將符合條件的過濾到一個(gè)新的數(shù)組恃疯。全部篩選完畢后漏设,返回這個(gè)新的數(shù)組。
- 一個(gè)數(shù)組中全是model對(duì)象今妄,大概如下所示
@interface StudentModel : NSObject
//學(xué)生名字
@property (nonatomic) NSString *name;
//學(xué)生年齡
@property (nonatomic) int age;
@end
篩選出年齡大于20歲的學(xué)生郑口, 我們先創(chuàng)建一點(diǎn)兒數(shù)據(jù)(正常這些數(shù)據(jù)都是網(wǎng)絡(luò)請(qǐng)求所得的),如下
StudentModel *stuOne = [[StudentModel alloc] init];
stuOne.name = @"李明";
stuOne.age = 17;
StudentModel *stuTwo = [[StudentModel alloc] init];
stuTwo.name = @"小華";
stuTwo.age = 19;
StudentModel *stuTree = [[StudentModel alloc] init];
stuTree.name = @"小李";
stuTree.age = 22;
篩選
NSArray *arr = @[stuOne, stuTwo, stuTree];
//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
原理和上一個(gè)例子類似盾鳞。舉一反三
篩選年齡是不是22的學(xué)生: age != 22 犬性。
等等,自行探索吧腾仅。
- 篩選出兩個(gè)數(shù)組的差集
NSArray *oArr = @[@"huahua"];
NSArray *tArr = @[@"xiaoming", @"xiaohong", @"huahua"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", oArr];
NSArray *resultArr = [tArr filteredArrayUsingPredicate:predicate];
在這個(gè)例子中 篩選條件理解為:tArr 在 oArr 不存在的元素乒裆。SELF 指的是tArr。
類似IN NOT 這樣的字符串有下面幾種固定的推励。
AND鹤耍、OR肉迫、IN、NOT稿黄、ALL喊衫、ANY、SOME杆怕、NONE族购、LIKE、CASEINSENSITIVE财著、CI联四、MATCHES、CONTAINS撑教、BEGINSWITH朝墩、ENDSWITH、BETWEEN伟姐、NULL收苏、NIL、SELF愤兵、TRUE鹿霸、YES、FALSE秆乳、NO懦鼠、FIRST、LAST屹堰、SIZE肛冶、ANYKEY、SUBQUERY扯键、CAST睦袖、TRUEPREDICATE、FALSEPREDICATE荣刑,
所表達(dá)的含義和字母意識(shí)都差不多馅笙。
- 查找出姓李的學(xué)生,使用上面例子的數(shù)據(jù)
NSArray *arr = @[stuOne, stuTwo, stuTree];
//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE '李*'"];
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
如果'李*'為變量厉亏,該變量屬于stuModel
NSArray *arr = @[stuOne, stuTwo, stuTree];
//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE %@", stuModel.name ];
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
本例的篩選條件涉及到LIKE董习,模糊查詢,類似sql語句的中的like爱只。
>'李*' : 姓李的阱飘。
>'*李*': 包含李字的。
'*李' : 李字結(jié)尾的。