IOS謂詞--NSPredicate

Cocoa 提供了NSPredicate 用於指定過濾條件,謂詞是指在計算機中表示計算真假值的函數,
它使用起來有點兒像SQL 的查詢條件,主要用於從集合中分揀出符合條件的對象,也可以
用於字符串的正則匹配。首先我們看一個非常簡單的例子,對謂詞有一個認知。
#import <Foundation/Foundation.h>
@interface Person: NSObject{
int pid;
NSString *name;
float height;
}
-(void) setPid: (int) pid;
-(void) setName: (NSString*) name;
-(void) setHeight: (float) height;
-(int) pid;
-(NSString*) name;
-(float) height;
@end
@implementation Person
-(void) setPid: (int) p{
pid=p;
}
-(void) setName: (NSString*) n{
[n retain];
[name release];
name=n;
}
-(void) setHeight: (float) h{
height=h;
}
-(int) pid{
return pid;
}
-(NSString*) name{
return name;
}
-(float) height{
return height;
}
-(void) dealloc{
[name release];
[super dealloc];
}
@end
int main (int argc , const char * argv[]){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//實例化三個Person,並放入數組。
NSMutableArray *array=[NSMutableArray arrayWithCapacity: 5];
Person *person1=[[Person alloc] init];
[person1 setPid: 1];
[person1 setName: @"Name1"];
[person1 setHeight: 168];
[array addObject: person1];
Person *person2=[[Person alloc] init];
[person2 setPid: 2];
[person2 setName: @"Name2"];
[person2 setHeight: 178];
[array addObject: person2];
Person *person3=[[Person alloc] init];
[person3 setPid: 3];
[person3 setName: @"Name3"];
[person3 setHeight: 188];
[array addObject: person3];
//創建謂詞,條件是pid>1 並且height<188.0。其實謂詞也是基於KVC 的,也就是如
果pid 在person 的成員變量xxx 中,那麼此處要寫成xxx.pid>1。
NSPredicate *pre = [NSPredicate predicateWithFormat:
@" pid>1 and height<188.0"];
int i=0;
for(;i<[array count];i++){
Person *person=[array objectAtIndex: i];
//遍歷數組,輸出符合謂詞條件的Person 的name。
if ([pre evaluateWithObject: person]) {
NSLog(@"%@",[person name]);
}
}
[person1 release];
[person2 release];
[person3 release];
[pool release];
return 0;
}
Shell 窗口輸出如下所示:
2011-04-01 16:51:18.382 Predicate[2400] Name2
我們看到創建謂詞使用類方法predicateWithFormat: (NSString*) format,format 裏的東西真的
和SQL 的where 條件差不多。另外,參數format 與NSLog 的格式化模版差不多,如果1 和
188.0 是傳遞過來的參數,你可以寫成如下的形式:
@"pid>%d and height<%f",1,188.0
(1.) 邏輯運算符:AND、OR、NOT
這幾個運算符計算並、或、非的結果。
(2.) 範圍運算符:BETWEEN、IN
例:
@”pid BETWEEN {1,5}”
@"name IN {'Name1','Name2'}"
(3.) 佔位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"Name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
佔位符就是字段對象裏的key,因此你可以有多個佔位符,只要key 不一樣就可以了。
(4.) 快速篩選數組:
前面我們都是使用謂詞逐個判斷數組內的對象是否符合,其實數組本身有更爲便捷的方法,
直接篩選出一個符合謂詞的新數組。
NSPredicate *pre = [NSPredicate predicateWithFormat:@"pid>1"];
NSMutableArray *arrayPre=[array filteredArrayUsingPredicate: pre];
NSLog(@"%@",[[arrayPre objectAtIndex: 0] name]);
(5.) 字符串運算符:
BEGINSWITH、ENDSWITH、CONTAINS 分別表示是否以某字符串開頭、結尾、包含。
他們可以與c、d 連用,表示是否忽略大小寫、是否忽略重音字母(字母上方有聲調標號)。
例:
@”name BEGINSWITH[cd] ‘He’”
判斷name 是否以He 開頭,並且忽略大小寫、忽略重音字母。
(6.) LIKE 運算符:
LIKE 使用?表示一個字符,*表示多個字符,也可以與c、d 連用。
例:
@”name LIKE ‘???er*’” 與Paper Plane 相匹配。
(7.) SELF:
前面的數組中放的都是對象,如果數組放的都是字符串(或者是其他沒有屬性的類型),該
怎麼寫謂詞呢?這裏我們使用SELF。
例:
NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];
(8.) 正則表達式:
NSPredicate 使用MATCHES 匹配正則表達式,正則表達式的寫法採用international components
for Unicode (ICU)的正則語法。
例:
NSString *regex = @"^A.+e$";//以A 開頭,以e 結尾的字符。
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Apple"]){
printf("YES\n");
}else{
printf("NO\n");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章