IOS謂詞–NSPredicate

來源:互聯網
上載者:User
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.) Regex:
NSPredicate 使用MATCHES 匹配Regex,Regex的寫法採用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");
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.