NSPredicate用法

篩選用法
NSArray

  • (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;

NSMutableArray

  • (void)filterUsingPredicate:(NSPredicate *)predicate;

自身屬性
NSArray *array = @[@"jim", @"cook", @"jobs", @"sdevm"]; NSPredicate *pre = [NSPredicate predicateWithFormat:@"length > 3"]; NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);

字符串相關
CONTAINS(包含)
NSArray *stringArray = [[NSArray alloc]initWithObjects:@"beijing",@"shanghai",@"guangzou",@"wuhan", nil]; NSString *string = @"ang"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@",string]; NSLog(@"%@",[stringArray filteredArrayUsingPredicate:pred])

SELF CONTAINS
表示自身包含
[c] 忽略大小寫[d] 忽略重音符號[cd]既不區分大小寫,也不區分發音符號。

[cd]的用法
NSArray *stringArray = [[NSArray alloc]initWithObjects:test1,test2,test3, nil]; NSString *targetString = @"Ang"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@",targetString]; NSLog(@"%@",[stringArray filteredArrayUsingPredicate:pred]);

上述打印都是相同的結果
2013-11-24 14:01:49.324 Nurse[5044:70b] ( shanghai, guangzou)

CONTAINS也可以用于自定義對象中
NSArray *stringArray = [[NSArray alloc]initWithObjects:test1,test2,test3, nil]; NSString *targetString = @"ang"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"title CONTAINS %@",targetString]; NSLog(@"%@",[stringArray filteredArrayUsingPredicate:pred]);

title CONTAINS
title就是Test對象中的一個屬性
BEGINSWITH(已某個字符串開頭, begins with)
NSString *targetString = @"ang"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"title BEGINSWITH %@",targetString];

ENDSWITH(已某個字符串結尾, ends with)
NSString *targetString = @"ang"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"title ENDSWITH %@",targetString];

比較運算符
符號
使用

==
NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID == %@",@12ll];

!=
NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID != %@",@1];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID > %@",@12ll];

<
NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID < %@",@1];

范圍運算符
符號
解釋
使用

IN
之中
NSString
類型,判斷title屬性是否是字符串@"angle"和@"addss"中的一個:NSPredicate *pred = [NSPredicate predicateWithFormat:@"title IN {'angle', 'addss'}"];

IN
之中
NSNumber
類型,判斷testID屬性是否是NSNumber對象中的@1和@13中的一個:NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID IN {1, 13}"]

BETWEEN
之間
{1, 13}包括1和13:NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID BETWEEN {1, 13}"]

通配符 LIKE(也可以接[cd])
符號
解釋
使用
備注

代表一個或者多個或者是空
NSPredicate pred = [NSPredicate predicateWithFormat:@"title LIKE 'ang*'"];

所以angle和lenang都符合

?

代表一個字符
NSPredicate pred = [NSPredicate predicateWithFormat:@"title LIKE '?ng'"];

所以只有 angle符合

AND(或&&)
NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID >= %@ AND testID <=%@", @1ll, @13ll];


NSPredicate *pred = [NSPredicate predicateWithFormat:@"testID BETWEEN {1, 13}"];

同樣的效果
OR(或||)
NSPredicate *pred = [NSPredicate predicateWithFormat:@"title == 'angle' OR title == 'lenang'"];


NSPredicate *pred = [NSPredicate predicateWithFormat:@"title IN {'angle', 'addss'}"];

有同樣的效果
NOT(或!)
從一個數組中過濾掉另外一個數組的所有數據
NSArray *arrayFilter = @[@"abc1", @"abc2"]; NSArray *arrayContent = @[@"a1", @"abc1", @"abc4", @"abc2"]; NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", arrayFilter]; NSLog(@"%@",[arrayContent filteredArrayUsingPredicate:thePredicate]);

指定字段過濾
NSPredicate *pred = [NSPredicate predicateWithFormat:@" NOT (testID IN %@ )",@[@1, @2]];

匹配用法

  • (BOOL)evaluateWithObject:(id)object;

Block

  • (NSPredicate*)predicateWithBlock:(BOOL (^)(id evaluatedObject, NSDictionary *bindings))block

NSArray *array = @[@"jim", @"cook", @"jbos"]; NSPredicate *pre = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { return [[evaluatedObject valueForKey:@"name"] isEqualToString:@"cook"]; }]; NSArray *aray = [array filteredArrayUsingPredicate:pre];

block中第二個參數代表其實就是需要篩選的數組對象的其中一個成員,第二個參數至今沒搞清楚作用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容