iOS之深入解析谓词NSPredicate的语法与应用
生活随笔
收集整理的這篇文章主要介紹了
iOS之深入解析谓词NSPredicate的语法与应用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、簡介
- NSPredicate 的官方解釋如下:
- NSPredicate 類是用來定義邏輯條件,用來有約束的獲取內(nèi)存中的對象或過濾搜索。
- 簡而言之:只選取符合條件的對象。
二、基本語法
- 使用謂詞(NSPredicate)都需要為謂詞定義謂詞表達(dá)式,而這個(gè)表達(dá)式必須是一個(gè)返回 BOOL 的值。
- 謂詞表達(dá)式由表達(dá)式、運(yùn)算符和值構(gòu)成。
① 比較運(yùn)算符
- =、==:判斷兩個(gè)表達(dá)式是否相等,在謂詞中 = 和 == 是相同的意思,而沒有賦值的概念。如下所示,當(dāng)傳入數(shù)組對象時(shí),報(bào)錯(cuò):*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSArrayI compare:]: unrecognized selector sent to instance 0x600000234c00’,可以發(fā)現(xiàn)底層調(diào)用了 compare: 方法。
- >=、=>:判斷左邊表達(dá)式的值是否大于或等于右邊表達(dá)式的值;
- <=、=<:判斷左邊表達(dá)式的值是否小于或等于右邊表達(dá)式的值;
- >:判斷左邊表達(dá)式的值是否大于右邊表達(dá)式的值;
- <:判斷左邊表達(dá)式的值是否小于右邊表達(dá)式的值;
- !=、<>:判斷兩個(gè)表達(dá)式是否不相等。
② 邏輯運(yùn)算符
- AND、&&:邏輯與,兩個(gè)表達(dá)式的值都為 YES 時(shí),結(jié)果才為 YES;
- OR、||:邏輯或,要求其中一個(gè)表達(dá)式為 YES 時(shí),結(jié)果就是 YES;
- NOT、!:邏輯非,對原有的表達(dá)式取反。
③ 關(guān)系運(yùn)算符
- ANY、SOME:集合中任意一個(gè)元素滿足條件,就返回 YES。
-
- 根據(jù)報(bào)錯(cuò)信息得知,謂詞表達(dá)式中 ANY 的操作的主體需要是 NSArray 或者 NSSet,上面 filteredArrayUsingPredicate: 方法傳入的是 Person 對象,所以報(bào)錯(cuò),因此 ANY 操作的數(shù)據(jù)結(jié)構(gòu)要是 @[@[]] 雙層數(shù)組。
- ALL:集合中所有元素都滿足條件,才返回 YES。
- NONE:集合中沒有任何元素滿足條件就返回 YES,等同于 not any。如: NONE person.age < 18,表示 person 集合中所有元素的 age >= 18 時(shí),才返回 YES。
- IN:等價(jià)于 SQL 語句中的 IN 運(yùn)算符,只有當(dāng)左邊表達(dá)式或值出現(xiàn)在右邊的集合中才會(huì)返回 YES。
④ 范圍運(yùn)算符
- BETWEEN:BETWEEN 表達(dá)式必須滿足表達(dá)式 BETWEEN {下限,上限} 的格式,要求該表達(dá)式必須大于或等于下限,并小于或等于上限。
- IN:
⑤ 字符串比較運(yùn)算符
- BEGINSWITH:檢查某個(gè)字符串是否以指定的字符串開頭;
- ENDSWITH:檢查某個(gè)字符串是否以指定的字符串結(jié)尾;
- CONTAINS:檢查某個(gè)字符串是否包含指定的字符串;
- LIKE:檢查某個(gè)字符串是否匹配指定的字符串模板。其之后可以跟 ? 代表一個(gè)字符和 * 代表任意多個(gè)字符。比如 “name LIKE ‘a(chǎn)c’”,這表示 name 的值中包含 ac 則返回 YES;“name LIKE ‘?ac*’”,表示 name 的第 2、3 個(gè)字符為 ac 時(shí)返回 YES;
- MATCHES:檢查某個(gè)字符串是否匹配指定的正則表達(dá)式,雖然正則表達(dá)式的執(zhí)行效率是最低的,但其功能是最強(qiáng)大的,也是最常用的。
- 注意:字符串比較都是區(qū)分大小寫和重音符號的。如:café 和 cafe 是不一樣的,Cafe 和 cafe 也是不一樣的。如果希望字符串比較運(yùn)算不區(qū)分大小寫和重音符號,請?jiān)谶@些運(yùn)算符后使用 [c]、[d] 選項(xiàng),其中 [c] 是不區(qū)分大小寫,[d] 是不區(qū)分重音符號,其寫在字符串比較運(yùn)算符之后,比如:name LIKE[cd] ‘cafe’,那么不論 name 是cafe、Cafe 還是 café 上面的表達(dá)式都會(huì)返回 YES。
⑥ 直接量
- FALSE、NO:代表邏輯假;
- TRUE、YES:代表邏輯真;
- NULL、NIL:代表空值;
- SELF:代表正在被判斷的對象自身,不區(qū)分大小寫,self 也可以;
- “string” 或 ‘string’:代表字符串;
- 數(shù)組:和 c 中的寫法相同,如:{‘one’, ‘two’, ‘three’};
- 數(shù)值:包括整數(shù)、小數(shù)和科學(xué)計(jì)數(shù)法表示的形式;
- 十六進(jìn)制數(shù):0x開頭的數(shù)字;
- 八進(jìn)制:0o開頭的數(shù)字;
- 二進(jìn)制:0b開頭的數(shù)字。
⑦ 數(shù)組操作
- array[index]:指定數(shù)組中特定索引處的元素;
- array[first]:指定第一個(gè)元素;
- array[last]:指定最后一個(gè)元素;
- array[size]:指定數(shù)組大小。
⑧ 保留字
- 下列單詞都是保留字(不區(qū)分大小寫):
- 雖然大小寫都可以,但是更推薦使用大寫來表示這些保留字。
三、謂詞的用法
① 數(shù)據(jù)校驗(yàn)
- evaluateWithObject: 方法返回的是一個(gè) BOOL 值,如果符合條件就返回 YES,不符合就返回 NO。常見的有判斷手機(jī)號碼、郵編等。
- 手機(jī)號碼的判斷如下所:
- 檢測字符串中是否有特殊字符:
② 過濾集合
- 謂詞本身就代表了一個(gè)邏輯條件,計(jì)算謂詞之后返回的結(jié)果永遠(yuǎn)為 BOOL 類型的值。而謂詞最常用的功能就是對集合進(jìn)行過濾。
- 當(dāng)程序使用謂詞對集合元素進(jìn)行過濾時(shí),程序會(huì)自動(dòng)遍歷其元素,并根據(jù)集合元素來計(jì)算謂詞的值,當(dāng)這個(gè)集合中的元素計(jì)算謂詞并返回 YES 時(shí),這個(gè)元素才會(huì)被保留下來。不過要注意程序會(huì)自動(dòng)遍歷其元素,它會(huì)將自動(dòng)遍歷過之后返回為 YES 的值重新組合成一個(gè)集合返回。
- 使用謂詞過濾不可變集合和可變集合的區(qū)別是:過濾不可變集合時(shí),會(huì)返回符合條件的集合元素組成的新集合;過濾可變集合時(shí),沒有返回值,會(huì)直接剔除不符合條件的集合元素。
③ 在謂詞中使用占位符參數(shù)
- 上面所有的例子中謂詞總是固定的,然而在現(xiàn)實(shí)中處理變量時(shí)決定了謂詞應(yīng)該是可變的。
- 首先如果想在謂詞表達(dá)式中使用變量,那么需要了解下列兩種占位符,相當(dāng)于變量名與變量值:
- 除此之外,還可以在謂詞表達(dá)式中使用動(dòng)態(tài)改變的屬性值,就像環(huán)境變量一樣。
總結(jié)
以上是生活随笔為你收集整理的iOS之深入解析谓词NSPredicate的语法与应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RxSwift之深入解析如何创建观察者O
- 下一篇: iOS逆向之hook框架frida的安装