【OC梳理】NSPredicate

NSPredicate

NSPredicate(謂詞),可以根據(jù)定義的模糊查詢條件,對(duì)內(nèi)存對(duì)象進(jìn)行過(guò)濾搜索。

基本語(yǔ)法
  • 謂詞表達(dá)式 : 由表達(dá)式、運(yùn)算符和值構(gòu)成。
    • 值:

    FALSE、NO:代表邏輯假
    TRUE、YES:代表邏輯真
    NULL、NIL:代表空值
    SELF:代表正在被判斷的對(duì)象自身
    "string"或'string':代表字符串
    數(shù)組:和c中的寫法相同,如:{'one', 'two', 'three'}。
    數(shù)值:包括證書、小數(shù)和科學(xué)計(jì)數(shù)法表示的形式
    十六進(jìn)制數(shù):0x開頭的數(shù)字
    八進(jìn)制:0o開頭的數(shù)字
    二進(jìn)制:0b開頭的數(shù)字

    • 運(yùn)算符:


常見用途

1.使用謂詞進(jìn)行正則匹配,例如:
匹配手機(jī)號(hào)

- (BOOL)checkPhoneNumber:(NSString *)phoneNumber
{
    NSString *regex = @"^[1][3-8]\\d{9}$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [pred evaluateWithObject:phoneNumber];
}

驗(yàn)證郵箱

+ (BOOL)validateEmail:(NSString *)email{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
    return [emailTest evaluateWithObject:email];
}

ps:使用正則匹配時(shí),更推薦使用NSRegularExpression而不是NSPredicate,因?yàn)镹SPredicate對(duì)某些表達(dá)式的匹配結(jié)果并不盡如人意。
正則相關(guān):正則表達(dá)式在IOS中的應(yīng)用

2.使用謂詞過(guò)濾集合

  • NSArray提供了如下方法使用謂詞來(lái)過(guò)濾集合
//使用指定的謂詞過(guò)濾NSArray集合,返回符合條件的元素組成的新集合
- (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate;
  • NSMutableArray提供了如下方法使用謂詞來(lái)過(guò)濾集合
//使用指定的謂詞過(guò)濾NSMutableArray,剔除集合中不符合條件的元素
- (void)filterUsingPredicate:(NSPredicate *)predicate;
  • NSSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
//使用指定的謂詞過(guò)濾NSSet集合,返回符合條件的元素組成的新集合
- (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate;
  • NSMutableSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
//使用指定的謂詞過(guò)濾NSMutableSet,剔除集合中不符合條件的元素
- (void)filterUsingPredicate:(NSPredicate *)predicate;
  • NSOrderedSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
//使用指定的謂詞過(guò)濾NSOrderedSet集合,返回符合條件的元素組成的新集合
- (NSOrderedSet<ObjectType> *)filteredOrderedSetUsingPredicate:(NSPredicate *)p;
  • NSMutableOrderedSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
//使用指定的謂詞過(guò)濾NSMutableOrderedSet,剔除集合中不符合條件的元素
- (void)filterUsingPredicate:(NSPredicate *)p;
  • 以上方法都可以在NSPredicate.h文件中找到。

使用示例:
創(chuàng)建數(shù)組,數(shù)組中的元素包含name和age兩個(gè)屬性

NSArray *persons = ...

定義謂詞對(duì)象,謂詞對(duì)象中包含了過(guò)濾條件
(過(guò)濾條件中,使用self.name和直接用name的效果一樣)

//age小于30  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<30"];  

//查詢name=1的并且age大于40  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"]; 

//name以a開頭的  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];  
//name以ba結(jié)尾的  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"]; 

//name為1/2/4,或者age為30/40
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN {'1','2','4'} || age IN{30,40}"];

 //like 匹配任意多個(gè)字符  
//name中只要有s字符就滿足條件  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '*s*'"];  
//?代表一個(gè)字符,下面的查詢條件是:name中第二個(gè)字符是s的  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '?s'"]; 

使用謂詞條件過(guò)濾數(shù)組中的元素,過(guò)濾之后返回查詢的結(jié)果

NSArray *array = [persons filteredArrayUsingPredicate:predicate];  
  • 謂詞的表達(dá)式中,如果要?jiǎng)討B(tài)修改條件,可以使用占位符:
    在使用時(shí),如果需要拼接屬性名,其占位符為%K(注意大寫)而不是%@,如:
NSString * key = @"age";
int age = 30;
//拼接示例:
[NSPredicate predicateWithFormat:@"%K < %d", key, age];

如果想動(dòng)態(tài)改變判斷的范圍,可以使用$ 開頭的占位符:

//用$AGE進(jìn)行占位,可以動(dòng)態(tài)修改$對(duì)應(yīng)的值,這里的AGE可以是任意字符串
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < $AGE"];

//修改AGE的值(AGE對(duì)應(yīng)上面的$后的字符串),生成新的NSPredicate對(duì)象
NSPredicate *newPredicate = [predicate predicateWithSubstitutionVariables:@{@"AGE":@30}];

//使用newPredicate過(guò)濾數(shù)組
NSArray *array = [persons filteredArrayUsingPredicate: newPredicate];

PS:個(gè)人感覺(jué)用字符串拼接的方式設(shè)置表達(dá)式的自由度更高。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容