iOS 謂詞

NSPredicate類是用來定義邏輯條件約束的獲取或內(nèi)存中的過濾搜索。

可以使用謂詞來表示邏輯條件,用于描述對(duì)象持久性存儲(chǔ)在內(nèi)存中的對(duì)象過濾。其實(shí)意思就是:我是一個(gè)過濾器,不符合條件的都滾開。

一、NSPredicate的基本語法

我們使用一門語言,無論是外語還是計(jì)算機(jī)語言,總是從語法開始的,這樣我們才能正確的把握邏輯。所以我們從語法開始說起。在這部分我們僅關(guān)心其語法的使用

只要我們使用謂詞(NSPredicate)都需要為謂詞定義謂詞表達(dá)式,而這個(gè)表達(dá)式必須是一個(gè)返回BOOL的值。

謂詞表達(dá)式由表達(dá)式、運(yùn)算符和值構(gòu)成。

1.比較運(yùn)算符

比較運(yùn)算符如下

=、==:判斷兩個(gè)表達(dá)式是否相等,在謂詞中=和==是相同的意思都是判斷,而沒有賦值這一說

NSNumber *testNumber = @123;

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = 123"];

if ([predicate evaluateWithObject:testNumber]) {

NSLog(@"testString:%@", testNumber);

}

>=,=>:判斷左邊表達(dá)式的值是否大于或等于右邊表達(dá)式的值

<=,=<:判斷右邊表達(dá)式的值是否小于或等于右邊表達(dá)式的值

>:判斷左邊表達(dá)式的值是否大于右邊表達(dá)式的值

<:判斷左邊表達(dá)式的值是否小于右邊表達(dá)式的值

!=、<>:判斷兩個(gè)表達(dá)式是否不相等

BETWEEN:BETWEEN表達(dá)式必須滿足表達(dá)式 BETWEEN {下限,上限}的格式,要求該表達(dá)式必須大于或等于下限,并小于或等于上限

NSNumber *testNumber = @123;

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {100, 200}"];

if ([predicate evaluateWithObject:testNumber]) {

NSLog(@"testString:%@", testNumber);

} else {

NSLog(@"不符合條件");

}

輸出結(jié)果為:

?PredicteDemo[4366:85408] testString:123

2.邏輯運(yùn)算符

AND、&&:邏輯與,要求兩個(gè)表達(dá)式的值都為YES時(shí),結(jié)果才為YES。

NSArray *testArray = @[@1, @2, @3, @4, @5, @6];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];

NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];

NSLog(@"filterArray:%@", filterArray);

輸出結(jié)果為:

?PredicteDemo[4531:89537] filterArray:(

3,

4

)

OR、||:邏輯或,要求其中一個(gè)表達(dá)式為YES時(shí),結(jié)果就是YES

NOT、 !:邏輯非,對(duì)原有的表達(dá)式取反

3.字符串比較運(yùn)算符

BEGINSWITH:檢查某個(gè)字符串是否以指定的字符串開頭(如判斷字符串是否以a開頭:BEGINSWITH 'a')

ENDSWITH:檢查某個(gè)字符串是否以指定的字符串結(jié)尾

CONTAINS:檢查某個(gè)字符串是否包含指定的字符串

LIKE:檢查某個(gè)字符串是否匹配指定的字符串模板。其之后可以跟?代表一個(gè)字符和*代表任意多個(gè)字符兩個(gè)通配符。比如"name LIKE '*ac*'",這表示name的值中包含ac則返回YES;"name LIKE '?ac*'",表示name的第2、3個(gè)字符為ac時(shí)返回YES。

MATCHES:檢查某個(gè)字符串是否匹配指定的正則表達(dá)式。雖然正則表達(dá)式的執(zhí)行效率是最低的,但其功能是最強(qiáng)大的,也是我們最常用的。

注:字符串比較都是區(qū)分大小寫和重音符號(hào)的。如:café和cafe是不一樣的,Cafe和cafe也是不一樣的。如果希望字符串比較運(yùn)算不區(qū)分大小寫和重音符號(hào),請(qǐng)?jiān)谶@些運(yùn)算符后使用[c],[d]選項(xiàng)。其中[c]是不區(qū)分大小寫,[d]是不區(qū)分重音符號(hào),其寫在字符串比較運(yùn)算符之后,比如:name LIKE[cd] 'cafe',那么不論name是cafe、Cafe還是café上面的表達(dá)式都會(huì)返回YES。

4.集合運(yùn)算符

ANY、SOME:集合中任意一個(gè)元素滿足條件,就返回YES。

ALL:集合中所有元素都滿足條件,才返回YES。

NONE:集合中沒有任何元素滿足條件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18時(shí),才返回YES。

IN:等價(jià)于SQL語句中的IN運(yùn)算符,只有當(dāng)左邊表達(dá)式或值出現(xiàn)在右邊的集合中才會(huì)返回YES。我們通過一個(gè)例子來看一下

NSArray *filterArray = @[@"ab", @"abc"];

NSArray *array = @[@"a", @"ab", @"abc", @"abcd"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];

NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);

代碼的作用是將array中和filterArray中相同的元素去除,輸出為:

?PredicteDemo[6701:136206] (

a,

abcd

)

array[index]:返回array數(shù)組中index索引處的元素

array[FIRST]:返回array數(shù)組中第一個(gè)元素

array[LAST]:返回array數(shù)組中最后一個(gè)元素

array[SIZE]:返回array數(shù)組中元素的個(gè)數(shù)

5.直接量

在謂詞表達(dá)式中可以使用如下直接量

FALSE、NO:代表邏輯假

TRUE、YES:代表邏輯真

NULL、NIL:代表空值

SELF:代表正在被判斷的對(duì)象自身

"string"或'string':代表字符串

數(shù)組:和c中的寫法相同,如:{'one', 'two', 'three'}。

數(shù)值:包括證書、小數(shù)和科學(xué)計(jì)數(shù)法表示的形式

十六進(jìn)制數(shù):0x開頭的數(shù)字

八進(jìn)制:0o開頭的數(shù)字

二進(jìn)制:0b開頭的數(shù)字

6.保留字

下列單詞都是保留字(不論大小寫)

AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE

注:雖然大小寫都可以,但是更推薦使用大寫來表示這些保留字

二、謂詞的用法

NSArray *persons = [NSArray arrayWithObjects:

[Person personWithName:@"mac" andAge:20],

[Person personWithName:@"1" andAge:30],

[Person personWithName:@"2" andAge:40],

[Person personWithName:@"3" andAge:50],

[Person personWithName:@"4" andAge:60],

[Person personWithName:@"5" andAge:70],

[Person personWithName:@"6" andAge:20],

[Person personWithName:@"7" andAge:40],

[Person personWithName:@"8" andAge:60],

[Person personWithName:@"9" andAge:40],

[Person personWithName:@"0" andAge:80],

[Person personWithName:@"10" andAge:90],

[Person personWithName:@"1" andAge:20]];

//年齡小于30

//定義謂詞對(duì)象,謂詞對(duì)象中包含了過濾條件

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];

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

NSArray *array = [persons filteredArrayUsingPredicate:predicate];

NSLog(@"filterArray=%@",array);

//查詢name=1的并且age大于40

predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"];

array = [persons filteredArrayUsingPredicate:predicate];

NSLog(@"filterArray=%@",array);

//in(包含)

predicate = [NSPredicate predicateWithFormat:@"self.name IN {'1','2','4'} || self.age IN{30,40}"];

//name以a開頭的

predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];

//name以ba結(jié)尾的

predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"];

//name中包含字符a的

predicate = [NSPredicate predicateWithFormat:@"name CONTAINS 'a'"];

//like 匹配任意多個(gè)字符

//name中只要有s字符就滿足條件

predicate = [NSPredicate predicateWithFormat:@"name like '*s*'"];

//?代表一個(gè)字符,下面的查詢條件是:name中第二個(gè)字符是s的

predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];

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

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

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