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