【OC梳理】NSPredicate

NSPredicate

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

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

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

    • 運(yùn)算符:


常見用途

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

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

驗證郵箱

+ (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:使用正則匹配時勺像,更推薦使用NSRegularExpression而不是NSPredicate障贸,因為NSPredicate對某些表達(dá)式的匹配結(jié)果并不盡如人意。
正則相關(guān):正則表達(dá)式在IOS中的應(yīng)用

2.使用謂詞過濾集合

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

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

NSArray *persons = ...

定義謂詞對象,謂詞對象中包含了過濾條件
(過濾條件中踏幻,使用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 匹配任意多個字符  
//name中只要有s字符就滿足條件  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '*s*'"];  
//?代表一個字符,下面的查詢條件是:name中第二個字符是s的  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '?s'"]; 

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

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

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

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荒吏,隨后出現(xiàn)的幾起案子敛惊,更是在濱河造成了極大的恐慌,老刑警劉巖绰更,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧挤,死亡現(xiàn)場離奇詭異,居然都是意外死亡儡湾,警方通過查閱死者的電腦和手機(jī)特恬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徐钠,“玉大人癌刽,你說我怎么就攤上這事〕⒇ぃ” “怎么了显拜?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爹袁。 經(jīng)常有香客問我远荠,道長,這世上最難降的妖魔是什么呢簸? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任矮台,我火速辦了婚禮,結(jié)果婚禮上根时,老公的妹妹穿的比我還像新娘瘦赫。我一直安慰自己,他們只是感情好蛤迎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布确虱。 她就那樣靜靜地躺著,像睡著了一般替裆。 火紅的嫁衣襯著肌膚如雪校辩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天辆童,我揣著相機(jī)與錄音宜咒,去河邊找鬼。 笑死把鉴,一個胖子當(dāng)著我的面吹牛故黑,可吹牛的內(nèi)容都是我干的儿咱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼场晶,長吁一口氣:“原來是場噩夢啊……” “哼混埠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诗轻,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤钳宪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扳炬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吏颖,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年恨樟,在試婚紗的時候發(fā)現(xiàn)自己被綠了侦高。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡厌杜,死狀恐怖奉呛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夯尽,我是刑警寧澤瞧壮,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站匙握,受9級特大地震影響咆槽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圈纺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一秦忿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛾娶,春花似錦灯谣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罗售,卻和暖如春辜窑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寨躁。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工穆碎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人职恳。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓所禀,卻偏偏與公主長得像谜悟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子北秽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容