轉(zhuǎn)【iOS開發(fā)技術(shù)】NSPredicate謂詞的用法 數(shù)組過濾

NSPredicate是什么

NSPredicate:謂詞

字面翻譯是這個意思,但是我覺得謂詞這個詞太難以理解了

NSPredicate的具體用途應該還是過濾,類似于過濾條件之類的,相當于一個主語的謂語,所以說會是謂詞這個名字。(我是這么理解的)

NSPredicate的創(chuàng)建

我們看到創(chuàng)建謂詞使用類方法predicateWithFormat: (NSString*) format,format 里的東西真的

和SQL 的where 條件差不多。

另外,參數(shù)format 與NSLog 的格式化模版差不多,如果1 和

188.0 是傳遞過來的參數(shù),你可以寫成如下的形式:

@"pid>%d and height<%f",1,188.0

NSPredicate中主要的幾種運算方式

1.比較運算符 > 、< 、== 、 >= 、<= 、 !=

例:@"number >= 99"

2.邏輯運算符:AND、OR、NOT 這幾個運算符計算并、或、非的結(jié)果。

3.范圍運算符:IN 、BETWEEN

例:@"number BETWEEN {1,5}"

@"address IN {'shanghai','nanjing'}"

4.字符串本身:SELF

例:@"SELF == 'APPLE'"

5.字符串相關(guān):BEGINSWITH、ENDSWITH、CONTAINS

例: @"name CONTAIN[cd] 'ang'" //包含某個字符串

@"name BEGINSWITH[c] 'sh'" //以某個字符串開頭

@"name ENDSWITH[d] 'ang'" //以某個字符串結(jié)束

注:[c]不區(qū)分大小寫 , [d]不區(qū)分發(fā)音符號即沒有重音符號 , [cd]既不區(qū)分大小寫,也不區(qū)分發(fā)音符號。

6.通配符:LIKE

例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].

@"name LIKE[cd] '???er*'"

7.正則表達式:MATCHES

例:NSString *regex = @"^A.+e$"; //以A開頭,e結(jié)尾

@"name MATCHES %@",regex

如何使用NSPredicate對一個自定義實體進行篩選

NSPredicate我暫時都是用于過濾的,否則我們過濾就需要自己寫判斷 寫循環(huán),去判斷輸出了。

接下來就上代碼和例子吧。

建立一個實體類 Dog

@property (copy? , nonatomic) NSString* name;

@property (assign , nonatomic) int? ? ? age ;

這樣我們就有一個類了

我們創(chuàng)建 5只Dog的實體

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的年齡 → 。→

然后我們需要一個Array把他們都裝進去

NSArray * dogArr=@[dog1,dog2,dog3,dog4,dog5];

醬紫所有的Dog都裝到一個數(shù)組里了

使用NSPredicate的篩選

沒有使用NSPredicate的篩選應該大家都會寫,循環(huán)+判斷。。。

使用NSPredicate的篩選

具體使用的代碼

//創(chuàng)建謂詞的對象 謂詞條件是基于KVC的,所以需要說明一點,加入Dog里面有個屬性是Doginfo指向Doginfo類,在使用的時候 我們的條件就要寫成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

NSPredicate篩選一個對象邏輯還是很清晰的,不過這里比較麻煩的就是 還有一個循環(huán),這里我們會發(fā)現(xiàn)數(shù)組提供了一個方法可以更方便的檢索數(shù)組對象

直接篩選出一個符合謂詞的新數(shù)組。

NSPredicate *pre = [NSPredicate predicateWithFormat:@"age >11"];

NSMutableArray *arrayPre=[dogArr filteredArrayUsingPredicate: pre];

arrayPre里面的對象就會是 除了dog1之外的所有的dog。(至于為什么看我的條件...)

看到這里發(fā)現(xiàn)NSPredicate 可以用于自定義的實體的檢索、篩選,那如果用于 NSString,NSInteger,bool呢?那我們再看一段代碼吧

NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil];

NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];

上面這段代碼是匹配字符串的時候 NSPredicate 需要如何聲明

使用NSPredicate在兩個數(shù)組之間進行差異篩選

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在前面有介紹過 可以往回翻閱一下

如何使用正則篩選一個數(shù)組

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");

}

關(guān)于NSPredicate的其他說明和注意事項,以及技巧

動態(tài)屬性名

假如你的代碼如下

NSPredicate *p = [NSPredicate predicateWithFormat:@"name = %@", @"name1"];

顯然代碼沒有任何問題,但是這個不是最好的寫法我建議如下寫法:

NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];

NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:

@"name1", @"NAME",nil];

NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];

這樣看上去可能會讓代碼邏輯更清晰。

當過濾條件字段都是動態(tài)的時候

NSString *key = @"name";

NSString *value = @"name1";

NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ = %@", key, value];

然后當你執(zhí)行到第三行的時候代碼就會報錯!

邏輯上沒錯誤?。。。槭裁磿鲥e呢?

NSPredicate要自動添加引號,所以最后得到的格式應該是@"'name' = 'name1'"。明顯不對。要做的就是:

NSPredicate *p = [NSPredicate predicateWithFormat:@"%K = %@", key, value];

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

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

  • 首先,我們需要知道何謂謂詞,讓我們看看官方的解釋:The NSPredicate class is used to...
    旭日飛揚閱讀 1,610評論 0 0
  • 轉(zhuǎn)載自:http://www.cocoachina.com/ios/20160111/14926.html 1、大...
    一筆春秋閱讀 2,914評論 0 2
  • 面試筆試都是必考語法知識的。請認真復習和深入研究OC。 Objective-C 方法和選擇器有何不同?(Diffe...
    b485c88ab697閱讀 5,865評論 0 35
  • 這些日子,某個擅長壓榨別人的朋友寄住在我家,還tm帶來了三條狗。我日。還好就快要搬走了。我以后決不允許任何非親人的...
    滌非閱讀 298評論 0 0
  • 今天呢,看的是一本適齡為三歲的繪本,書名為「誰偷了包子?」。 翻開這本書,給我的第一感覺就是濃濃的中國風味,各種胡...
    噗呲噗呲閱讀 453評論 0 0

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