Predicate常被翻譯成“謂詞”贾费,它被用于描述一個(gè)對(duì)象的性質(zhì)或者對(duì)象間的相互關(guān)系,比如“小明是程序員”這個(gè)句子中的“是程序員”就是一個(gè)謂詞。
在Cocoa中热芹,NSPredicate是可以根據(jù)對(duì)象的性質(zhì)或者相互關(guān)系來(lái)進(jìn)行邏輯判斷的工具。
只看概念不太好理解惨撇,直接上代碼:
NSPredicate *isRich = [NSPredicate predicateWithFormat:@"account.balance > 5000000"];
Person *zhangSan = [[Person alloc] initWithName:@"ZhangSan" andBalance:9999];
Person *bill = [[Person alloc] initWithName:@"Bill" andBalance:1000000000];
NSLog(@"%d", [isRich evaluateWithObject:zhangSan]); // 輸出0
NSLog(@"%d", [isRich evaluateWithObject:bill]); // 輸出1
創(chuàng)建NSPredicate對(duì)象
從上面的例子里可以看到伊脓,我們可以通過(guò)NSPredicate提供的類方法,用格式化字符串方便地創(chuàng)建NSPredicate對(duì)象魁衙。
Cocoa為格式化字符串提供了豐富的語(yǔ)法支持:
比較運(yùn)算符:<报腔、<=、>剖淀、>=纯蛾、=、!=纵隔、BETWEEN
[NSPredicate predicateWithFormat:@"account.balance > 5000000"];
[NSPredicate predicateWithFormat:@"account.balance BETWEEN {100, 1000}"];
復(fù)合運(yùn)算符:OR翻诉、AND和NOT
[NSPredicate predicateWithFormat:@"startDate <= %@ AND endDate >= %@", now, now];
字符串判斷:BEGINSWITH、CONTAINS
捌刮、ENDSWITH碰煌、LIKE、MATCHES
[NSPredicate predicateWithFormat:@"name BEGINSWITH 'Zhang'" ];
[NSPredicate predicateWithFormat:@"name CONTAINS 'ang'" ];
// LIKE支持通配符糊啡,*代表任意個(gè)字符拄查,?代表僅有一個(gè)字符
[NSPredicate predicateWithFormat:@"url LIKE 'https://*.taobao.com*'" ];
// MATCHES支持正則表達(dá)式
NSString *regex = @"[0-9]*";
[NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
集合運(yùn)算:ANY、SOME棚蓄、ALL堕扶、NONE、IN
NSArray *names = @[@"ZhangSan", @"LiSi", @"WangWu"];
NSPredicate *anyIsZhang = [NSPredicate predicateWithFormat:@"ANY SELF BEGINSWITH 'Zhang'" ];
NSLog(@"%d", [anyIsZhang evaluateWithObject:names]);
常量和占位符:%@梭依、%k稍算、SELF
// 在格式化字符串的語(yǔ)法中,常量必須用引號(hào)包圍起來(lái)役拴,而屬性名字不用
// 比如在name BEGINSWITH 'Zhang'這個(gè)格式化字符串里糊探,name為屬性,Zhang為常量
// 上面的例子大都是把常量硬編碼在字符串里,但是我們的實(shí)際開(kāi)發(fā)中會(huì)更多的用到占位符
[NSPredicate predicateWithFormat:@"name BEGINSWITH %@", familyName];
// 需要注意的是科平,在%@作為占位符時(shí)褥紫,它會(huì)被自動(dòng)加上引號(hào)
// "name BEGINSWITH %@" 會(huì)變成 "name BEGINSWITH 'familyName'"
// 所以%@只能作為常量的占位符。
// 當(dāng)我們想動(dòng)態(tài)的填入屬性名的時(shí)候瞪慧,我們就必須這樣寫:
[NSPredicate predicateWithFormat:@"%k BEGINSWITH %@", propertyName, familyName];
// 在蘋果的官方文檔里面有一個(gè)%@錯(cuò)誤用法的示范髓考,大家可以想一下這樣用為什么不對(duì):
predicate = [NSPredicate predicateWithFormat:@"SELF like %@*%@", prefix, suffix];
ok = [predicate evaluateWithObject:@"prefixxxxxxsuffix"];
除了上面提到的使用格式化字符串創(chuàng)建NSPredicate的方法之外,Cocoa提供了另外兩種創(chuàng)建NSPredicate的方法弃酌。它們的語(yǔ)法相對(duì)復(fù)雜氨菇,在這里就不多贅述了。
NSPredicate對(duì)象的用法
NSPredicate的最基本用法妓湘,就是創(chuàng)建一個(gè)NSPredicate對(duì)象查蓉,把要判斷的對(duì)象傳遞給它,使用evaluateWithObject:方法判斷:
NSPredicate *isRich = [NSPredicate predicateWithFormat:@"account.balance > 5000000"];
Person *zhangSan = [[Person alloc] initWithName:@"ZhangSan" andBalance:9999];
NSLog(@"%d", [isRich evaluateWithObject:zhangSan]); // 輸出0
我們還可以用NSPredicate來(lái)作為集合的過(guò)濾器用榜贴,這種寫法相當(dāng)簡(jiǎn)潔優(yōu)雅:
NSArray *names = @[@"ZhangSan", @"LiSi", @"WangWu"];
NSPredicate *containsN = [NSPredicate predicateWithFormat:@"SELF CONTAINS 'n'" ];
NSLog(@"%@", [names filteredArrayUsingPredicate:containsN]); // 輸出["ZhangSan", "WangWu"]