NSPredicate謂詞的用法

2021-07-09 22:39:27 字數 4025 閱讀 2959

nspredicate:謂詞

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

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

我們看到建立謂詞使用類方法predicatewithformat: (nsstring*) format,format 裡的東西真的

和sql 的where 條件差不多。

另外,引數format 與nslog 的格式化模版差不多,如果1 和

188.0 是傳遞過來的引數,你可以寫成如下的形式:

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

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

例:@"number >= 99"

2.邏輯運算子:and、or、not 這幾個運算子計算並、或、非的結果。

3.範圍運算子:in 、between

例:@"number between "

@"address in "

5.字串相關:beginswith、endswith、contains

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

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

@"name endswith[d] 'ang'" //以某個字串結束

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

6.萬用字元:like

例:@"name like[cd] '*er*'" //*代表萬用字元,like也接受[cd].

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

7.正規表示式:matches

例:nsstring *regex = @"^a.+e$"; //以a開頭,e結尾

@"name matches %@",regex

nspredicate我暫時都是用於過濾的,否則我們過濾就需要自己寫判斷 寫迴圈,去判斷輸出了。

接下來就上**和例子吧。

@property (copy   , nonatomic) nsstring* name; 

@property (assign , nonatomic) int age ;

這樣我們就有乙個類了

我們建立 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都裝到乙個陣列裡了

沒有使用nspredicate的篩選應該大家都會寫,迴圈+判斷。。。

使用nspredicate的篩選

具體使用的**

//建立謂詞的物件 謂詞條件是基於kvc的,所以需要說明一點,加入dog裡面有個屬性是doginfo指向doginfo類,在使用的時候 我們的條件就要寫成doginfo.***了。

nspredicate* predicate = [nspredicate predicatewithformat:@"name=='這是第一只dog' and age ==11"];

for(dog * d in dogarr)

}

以上的**列印出來的結果就是 這是第一只dog

nspredicate篩選乙個物件邏輯還是很清晰的,不過這裡比較麻煩的就是 還有乙個迴圈,這裡我們會發現陣列提供了乙個方法可以更方便的檢索陣列物件

直接篩選出乙個符合謂詞的新陣列。

nspredicate *pre = [nspredicate predicatewithformat:@"age >11"];

nsmutablearray *arraypre=[dogarr filteredarrayusingpredicate: pre];

arraypre裡面的物件就會是 除了dog1之外的所有的dog。(至於為什麼看我的條件...)

看到這裡發現nspredicate 可以用於自定義的實體的檢索、篩選,那如果用於 nsstring,nsinteger,bool呢?那我們再看一段**吧

上面這段**是匹配字串的時候 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);

上面的**輸出結果 arr3=

這樣大家就很容易理解了

self在前面有介紹過 可以往回翻閱一下

nsstring *regex = @"^a.+e$";//以a 開頭,以e 結尾的字元。

nspredicate *pre= [nspredicate predicatewithformat:@"self matches %@", regex];

printf("yes\n");

}else

動態屬性名

nspredicate *p = [nspredicate predicatewithformat:@"name = %@", @"name1"];
顯然**沒有任何問題,但是這個不是最好的寫法我建議如下寫法:

nspredicate *pretemplate = [nspredicate predicatewithformat:@"name==$name"];

nsdictionary *dic=[nsdictionary dictionarywithobjectsandkeys:

@"name1", @"name",nil];

nspredicate *pre=[pretemplate predicatewithsubstitutionvariables: dic];

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

nsstring *key = @"name";     

nsstring *value = @"name1";

nspredicate *p = [nspredicate predicatewithformat:@"%@ = %@", key, value];

然後當你執行到第三行的時候**就會報錯!

邏輯上沒錯誤啊!!!為什麼會出錯呢?

nspredicate要自動新增引號,所以最後得到的格式應該是@"'name' = 'name1'"。明顯不對。要做的就是:

nspredicate *p = [nspredicate predicatewithformat:@"%k = %@", key, value];
nspredicate 的簡單的使用就介紹到這裡,這裡有些都是從網路上其他人的額部落格轉過來的內容,我自己加以修改和一些自己的理解。希望可以幫到大家。

謂詞NSPredicate的使用

謂詞是用來為資料新增過濾條件,從而更加精確的找到找到所描述條件的資料。蘋果為我們封裝好了nspredicate類,我們可以很方便的得到我們需要的過濾條件。謂詞的簡單語法總結 比較運算 大於 小於 大於等於 小於等於 等於 不等於 between 左邊的表示式等於右邊的表示式的值或者介於它們之間。右邊...

謂詞 (NSPredicate)使用詳情

謂詞 更加詳細 判斷是否滿足條件 第一種判斷乙個陣列 array 中滿足條件的 nspredicate predicate nspredicate predicatewithformat age 20 定義謂詞 for person p in array 第二種 nspredicate predic...

關於謂詞NSPredicate的使用

關於nspredicate的使用,網上已經有很多文章,有一些很不錯,之前看的就是這篇 點選開啟鏈結 根據自己的使用總結下 我主要是用在對陣列的篩選上,相對迴圈陣列然後自己去匹配,要簡潔得多。而且對於陣列裡面巢狀字典或物件的結構很好。1 nspredicate的構建 nspredicate filte...