謂詞 NSPredicate

NSPredicate 主要是用來查詢、條件過濾;
最常用的場景就是在自定義的數據模型對象中根據條件來查詢相關信息,例如在手機通訊錄中根據個人信息的Model所包含的name屬性,來進行搜索
* 簡言之* NSPredicate可以判斷某個對象的某一個屬性是否符合某一條件

比較運算符

  • =、==:判斷兩個表達式是否相等,在謂詞中=和==是相同的意思都是判斷,不是賦值。
  • >=,=>:判斷左邊表達式的值是否大於或等於右邊表達式的值
  • <=,=<:判斷左邊表達式的值是否小於或等於右邊表達式的值
  • >:判斷左邊表達式的值是否大於右邊表達式的值
  • <:判斷左邊表達式的值是否小於右邊表達式的值
  • !=、<>:判斷兩個表達式是否不相等
  • BETWEEN:BETWEEN表達式必須滿足表達式 BETWEEN {下限,上限}的格式,要求該表達式必須大於或等於下限,並小於或等於上限
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {100, 200}"];
BOOL isBool = [predicate evaluateWithObject:testNumber];

邏輯運算符

AND、&&:邏輯與,要求兩個表達式的值都爲YES時,結果才爲YES。
OR、||:邏輯或,要求其中一個表達式爲YES時,結果就是YES
NOT、 !:邏輯非,對原有的表達式取反

NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];
NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray:%@", filterArray);

字符串比較運算(可以直接使用字符串的相關屬性)

BEGINSWITH:檢查某個字符串是否以指定的字符串開頭(如判斷字符串是否以a開頭:BEGINSWITH 'a')
ENDSWITH:檢查某個字符串是否以指定的字符串結尾
CONTAINS:檢查某個字符串是否包含指定的字符串
LIKE:檢查某個字符串是否匹配指定的字符串模板。其之後可以跟?代表一個字符和*代表任意多個字符兩個通配符。比如"name LIKE '*ac*'",這表示name的值中包含ac則返回YES"name LIKE '?ac*'",表示name的第23個字符爲ac時返回YES。
MATCHES:檢查某個字符串是否匹配指定的正則表達式。雖然正則表達式的執行效率是最低的,但其功能是最強大的,也是我們最常用的。

注:字符串比較都是區分大小寫和重音符號的。如:café和cafe是不一樣的,Cafe和cafe也是不一樣的。如果希望字符串比較運算不區分大小寫和重音符號,請在這些運算符後使用[c],[d]選項。其中[c]是不區分大小寫,[d]是不區分重音符號,其寫在字符串比較運算符之後,比如:name LIKE[cd] 'cafe',那麼不論name是cafe、Cafe還是café上面的表達式都會返回YES。

集合使用謂詞

ANY、SOME:集合中任意一個元素滿足條件,就返回YES。
ALL:集合中所有元素都滿足條件,才返回YES。
NONE:集合中沒有任何元素滿足條件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18時,才返回YES。
IN:等價於SQL語句中的IN運算符,只有當左邊表達式或值出現在右邊的集合中才會返回YES。我們通過一個例子來看一下

NSArray *filterArray = @[@"ab", @"abc"];
NSArray *array = @[@"a", @"ab", @"abc", @"abcd"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];
NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);
NSArray提供瞭如下方法使用謂詞來過濾集合
- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSArray集合,返回符合條件的元素組成的新集合
NSMutableArray提供瞭如下方法使用謂詞來過濾集合
- (void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSMutableArray,剔除集合中不符合條件的元素
NSSet提供瞭如下方法使用謂詞來過濾集合
- (NSSet<ObjectType> *)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSArray中的方法
NSMutableSet提供瞭如下方法使用謂詞來過濾集合
- (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSMutableArray中的方法。
通過上面的描述可以看出,使用謂詞過濾不可變集合和可變集合的區別是:過濾不可變集合時,會返回符合條件的集合元素組成的新集合;過濾可變集合時,沒有返回值,會直接剔除不符合條件的集合元素

謂詞中使用佔位符

* %K:用於動態傳入屬性名
* %@:用於動態設置屬性值
其實相當於變量名與變量值
除此之外,還可以在謂詞表達式中使用動態改變的屬性值,就像環境變量一樣
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS $VALUE"];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章