關於謂詞NSPredicate的使用

2022-05-28 02:45:10 字數 3453 閱讀 9063

關於nspredicate的使用,網上已經有很多文章,有一些很不錯,之前看的就是這篇:點選開啟鏈結 。根據自己的使用總結下:

我主要是用在對陣列的篩選上,相對迴圈陣列然後自己去匹配,要簡潔得多。而且對於陣列裡面巢狀字典或物件的結構很好。

1、 nspredicate的構建:

nspredicate

* filterpredicate = [

nspredicate

predicatewithformat

:@"label.text

== '3' "

];使用一段字串構建,是一段匹配性質的字串,類似sql的用法。我的理解是,這段字串可以分為3個部分,左邊是用來匹配的東西,右邊是被匹配的目標值,中間用來指定用什麼關係來匹配。所以也按著這個思路來說nspredicate的構建。

(1)用來匹配的東西:

- (void)demo_method,@,@,@];

nspredicate * arrpredicate = [nspredicate predicatewithformat:@"num = 3"];

nsarray * filteredarr = [arr filteredarrayusingpredicate:arrpredicate];

nslog(@"%@",filteredarr);

}

這裡使用@「num = 3」;會將num當做鍵獲取值,然後用這個值來進行匹配。因為物件的屬性頁可以通過valueforkey獲得,所以如果這裡的陣列裡面是放了乙個個的物件,而這個物件有乙個屬性num,依然可以使用這個nspredicate進行篩選。而且當資料巢狀很深時依然可以使用:

- (void)instancepredicate2

nslog(@"%@",testarr);

nspredicate * filterpredicate = [nspredicate predicatewithformat:@"label.text.length == 2"];

nsarray * filteredarr = [testarr filteredarrayusingpredicate:filterpredicate];

nslog(@"%@",((testobject *)filteredarr[0]).label);

}

testobject是自定義的乙個類,只有乙個uilabel * label的屬性,陣列裡面新增的是testobject物件,使用字串為「label.text.length」可以一層層的向下獲取屬性,然後進行匹配,主要是這裡可以使用.(點)這個字元,非常好。

(2)進行匹配的關係以及對應的被匹配的目標值的寫法:

借鑑網上其他文章,有這些運算子:比較運算子》,<,==,>=,<=,!=  ,in,between, beginswith、endswith、contains,like,matches

比較運算子沒什麼可多說的,

in:

nsarray * arr = @[@214411,@12,@553,@34,@6335];
nspredicate * pre = [nspredicate predicatewithformat:@"self in %@",arr];

flag = [pre evaluatewithobject:@214411]; //flag結果為yes

in用於匹配在乙個陣列中是否存在特定的值或物件。也可以這樣寫:

nspredicate * pre = [nspredicate predicatewithformat:@"self in "];

flag = [pre evaluatewithobject:@214411];

或者使用類似stringwithformater:的寫法,在引號裡面使用%@,外面跟上相應的物件,這樣可以匹配任意類的物件:

nspredicate * pre = [nspredicate predicatewithformat:@"self in ",@214411];
between:

和in:可以用於數字、日期和字串,用於判斷指定的物件的值是否在給定的兩者之間:

nsdateformatter * formatter = [[nsdateformatter alloc]init];

[formatter setdateformat:@"yyyy-mm-dd"];

nsdate * date1 = [formatter datefromstring:@"2014-03-01"];

nsdate * date2 = [formatter datefromstring:@"2014-05-01"];

nsarray * arr = @[date1,date2];

nspredicate * pre = [nspredicate predicatewithformat:@"self between %@",arr];

flag = [pre evaluatewithobject:[formatter datefromstring:@"2014-4-22"]];

被匹配的目標值需要乙個陣列,而且是只有兩個值的陣列,都是數字或都是nsdate物件、或字串。數字就是這兩個數提供乙個範圍,比如3到10,日期也一樣,不過字串不清楚怎麼用的。這例子裡的日期需要自己構建,如果是在某個專案中已經有了日期和範圍,那麼兩句話就可以判斷指定日期是否在特定的範圍內,還是很簡潔的。

beginswith、endswith、contains:

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

like:

like用來匹配字串,相對上面3個更靈活一些,如:@"name like[cd]

'???er*'";

?匹配單個字元,有幾個?代表這個位置有幾個字元,需要數量匹配上才可以,*匹配多個字元,只要這個位置有字元就可以。使用『er*』就可以替代beginswith

。matches:

以上說的都是乙個條件,可以使用and合併兩個條件。

2、nspredicate的使用:

(1)用於過濾陣列:nspredicate構建之後,陣列使用

nsarray * filteredarr = [testarr filteredarrayusingpredicate:filterpredicate];
進行篩選。篩選之後的結果也是乙個陣列,因為可能會匹配多個值

(2)對某個物件的的屬性進行判斷:

nspredicate * pre = [nspredicate predicatewithformat:@"self between %@",arr];

flag = [pre evaluatewithobject:[formatter datefromstring:@"2014-4-22"]];

最後,我認為大於小於、是否包含等判斷可以不適用nspredicate,因為這種判斷本身很簡單,使用謂詞反而麻煩,只有在對陣列的每個值都進行判斷或者類似日期包含這樣較複雜的判斷時候,就是用謂詞,可以盡量簡潔。

NSPredicate謂詞的用法

nspredicate 謂詞 字面翻譯是這個意思,但是我覺得謂詞這個詞太難以理解了 nspredicate的具體用途應該還是過濾,類似於過濾條件之類的,相當於乙個主語的謂語,所以說會是謂詞這個名字。我是這麼理解的 我們看到建立謂詞使用類方法predicatewithformat nsstring f...

謂詞NSPredicate的使用

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

謂詞 (NSPredicate)使用詳情

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