NSPredicate:謂詞
字面翻譯是這個(gè)意思,但是我覺得謂詞這個(gè)詞太難以理解了
NSPredicate的具體用途應(yīng)該還是過濾,類似于過濾條件之類的,相當(dāng)于一個(gè)主語的謂語,所以說會(huì)是謂詞這個(gè)名字。(我是這么理解的)
我們看到創(chuàng)建謂詞使用類方法predicateWithFormat: (NSString*) format,format 里的東西真的
和SQL 的where 條件差不多。
另外,參數(shù)format 與NSLog 的格式化模版差不多,如果1 和
188.0 是傳遞過來的參數(shù),你可以寫成如下的形式:
@"pid>%d and height<%f",1,188.0
1.比較運(yùn)算符 > 、< 、== 、 >= 、<= 、 !=
例:@"number >= 99"
2.邏輯運(yùn)算符:AND、OR、NOT 這幾個(gè)運(yùn)算符計(jì)算并、或、非的結(jié)果。
3.范圍運(yùn)算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','nanjing'}"
4.字符串本身:SELF
例:@"SELF == 'APPLE'"
5.字符串相關(guān):BEGINSWITH、ENDSWITH、CONTAINS
例: @"name CONTAIN[cd] 'ang'" //包含某個(gè)字符串
@"name BEGINSWITH[c] 'sh'" //以某個(gè)字符串開頭
@"name ENDSWITH[d] 'ang'" //以某個(gè)字符串結(jié)束
注:[c]不區(qū)分大小寫 , [d]不區(qū)分發(fā)音符號(hào)即沒有重音符號(hào) , [cd]既不區(qū)分大小寫,也不區(qū)分發(fā)音符號(hào)。
6.通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
7.正則表達(dá)式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A開頭,e結(jié)尾
@"name MATCHES %@",regex
NSPredicate我暫時(shí)都是用于過濾的,否則我們過濾就需要自己寫判斷 寫循環(huán),去判斷輸出了。
接下來就上代碼和例子吧。
@property (copy , nonatomic) NSString* name; @property (assign , nonatomic) int age ;
這樣我們就有一個(gè)類了
我們創(chuàng)建 5只Dog的實(shí)體
Dog * dog1=[Dog news];dog1.name=@"這是第一只Dog";dog1.age=@"11"; Dog * dog2=[Dog news];dog2.name=@"這是第二只Dog";dog2.age=@"22"; Dog * dog3=[Dog news];dog3.name=@"這是第三只Dog";dog3.age=@"33"; Dog * dog4=[Dog news];dog4.name=@"這是第四只Dog";dog4.age=@"44"; Dog * dog5=[Dog news];dog5.name=@"這是第五只Dog";dog5.age=@"55";
不要吐槽我的Dogs的年齡 → ?!?br />然后我們需要一個(gè)Array把他們都裝進(jìn)去
NSArray * dogArr=@[dog1,dog2,dog3,dog4,dog5];
醬紫所有的Dog都裝到一個(gè)數(shù)組里了
沒有使用NSPredicate的篩選應(yīng)該大家都會(huì)寫,循環(huán)+判斷。。。
使用NSPredicate的篩選
//創(chuàng)建謂詞的對(duì)象 謂詞條件是基于KVC的,所以需要說明一點(diǎn),加入Dog里面有個(gè)屬性是Doginfo指向Doginfo類,在使用的時(shí)候 我們的條件就要寫成Doginfo.xxx了。 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name=='這是第一只Dog' AND age ==11"]; for(Dog * d in dogArr) { if([predicate evaluateWithObject:d]) { NSLog(d.name); } }
以上的代碼打印出來的結(jié)果就是 這是第一只Dog
直接篩選出一個(gè)符合謂詞的新數(shù)組。
NSPredicate *pre = [NSPredicate predicateWithFormat:@"age >11"]; NSMutableArray *arrayPre=[dogArr filteredArrayUsingPredicate: pre];
arrayPre里面的對(duì)象就會(huì)是 除了dog1之外的所有的dog。(至于為什么看我的條件...)
NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil]; NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];
上面這段代碼是匹配字符串的時(shí)候 NSPredicate 需要如何聲明
NSArray* array = @[@"aa",@"bb"]; NSArray* array2 = @[@"aa",@"bb",@"cc",@"dd"]; NSPredicate* thePredicate = [NSPredicate predicateWithFormat:@"NOT(SELF in %@)",array]; NSArray* arr3 = [array2 filteredArrayUsingPredicate:thePredicate]; NSLog(@"%@",arr3);
上面的代碼輸出結(jié)果 arr3={@"cc" ,@"dd"}
這樣大家就很容易理解了
SELF在前面有介紹過 可以往回翻閱一下
NSString *regex = @"^A.+e$";//以A 開頭,以e 結(jié)尾的字符。 NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; if([pre evaluateWithObject: @"Apple"]){ printf("YES\n"); }else{ printf("NO\n"); }
動(dòng)態(tài)屬性名
NSPredicate *p = [NSPredicate predicateWithFormat:@"name = %@", @"name1"];
顯然代碼沒有任何問題,但是這個(gè)不是最好的寫法我建議如下寫法:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"]; NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys: @"name1", @"NAME",nil]; NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
這樣看上去可能會(huì)讓代碼邏輯更清晰。
NSString *key = @"name"; NSString *value = @"name1"; NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ = %@", key, value];
然后當(dāng)你執(zhí)行到第三行的時(shí)候代碼就會(huì)報(bào)錯(cuò)!
邏輯上沒錯(cuò)誤?。。。槭裁磿?huì)出錯(cuò)呢?
NSPredicate要自動(dòng)添加引號(hào),所以最后得到的格式應(yīng)該是@"'name' = 'name1'"。明顯不對(duì)。要做的就是:
NSPredicate *p = [NSPredicate predicateWithFormat:@"%K = %@", key, value];
NSPredicate 的簡(jiǎn)單的使用就介紹到這里,這里有些都是從網(wǎng)絡(luò)上其他人的額博客轉(zhuǎn)過來的內(nèi)容,我自己加以修改和一些自己的理解。希望可以幫到大家。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。