NSPredicate使用

NSPredicate是一個Foundation類,它指定數據被獲取或者過濾的方式。

NSPredicate使用時主要分兩步走:第一步,定義謂詞語句;第二步,根據要求,選擇不同的方法執行謂詞語句。

一.定義謂詞語句

首先,我們來定義一個謂詞語句,在定義謂詞語句時,先介紹謂詞的語法。

1.比較運算符(用于數值和字符串)

?>:大于

?<:小于

?>=:大于等于

?<=:小于等于

?=,==:等于

?!=,<>:不等于

?between:左邊的表達式等于右邊的表達式的值或者介于它們之間。右邊是一個有兩個指定上限和下限的數值的數列(指定順序的數列)。比如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。

2.邏輯運算符

and/&&:與

?or/||:或

?not/!:非

3.關系運算符

? ANY,SOME:指定下列表達式中的任意元素。比如,ANY children.age < 18。

? ALL:指定下列表達式中的所有元素。比如,ALL children.age < 18。

? NONE:指定下列表達式中沒有的元素。比如,NONE children.age < 18。它在邏輯上等于NOT (ANY ...)。

?IN:等于SQL的IN操作,左邊的表達必須出現在右邊指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。

4.字符串本身:SELF

例:@"SELF == 'APPLE'"

5.字符串相關:BEGINSWITH、ENDSWITH、CONTAINS

例:@"name CONTAIN[cd] 'ang'"? //包含某個字符串

@"name BEGINSWITH[c] 'sh'"? ? //以某個字符串開頭

@"name ENDSWITH[d] 'ang'"? ? ? //以某個字符串結束

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

6.通配符:LIKE

例:@"name LIKE[cd] '*er*'"? ? //*代表通配符,Like也接受[cd].

@"name LIKE[cd] '???er*'"

7.正則表達式:MATCHES

例:NSString *regex = @"^A.+e$";? //以A開頭,e結尾

@"name MATCHES %@",regex

二.執行謂詞語句

方法1:- (void)filterUsingPredicate:(NSPredicate *)predicate;針對可變數組進行過濾,過濾掉可變數組中不符合條件的。

例:

//定義謂詞語句

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];

//過濾可變數組

[_mutableArray filterUsingPredicate:predicate];

方法2:- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 針對不可變數組進行過濾,將符合條件的元素組成一個新數組進行返回

例:

//定義謂詞語句

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];

// 不可變數組過濾將過濾后符合條件的元素組成一個新數組返回

NSArray *array = [[NSArray alloc]initWithArray:_mutableArray];

array = [array filteredArrayUsingPredicate:predicate];


方法3:- (BOOL)evaluateWithObject:(id)object; 向謂詞對象發送該方法,參數是過濾的對象。常見于和正則表達式配合使用。

例:

NSString *number = @"^[0-9]$";

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];

//符合過濾條件就返回yes

BOOL ?isTrue = [predicate ?evaluateWithObject:textString];

三.其他使用場景

NSArray *array1 = [NSArray arrayWithObjects:@1,@2,@3,@5,@5,@6,@7, nil];

NSArray *array2 = [NSArray arrayWithObjects:@4,@5, nil];

// 表示篩選array1在array2中的元素! 其中SELF指向filteredArrayUsingPredicate的調用者。

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF? in %@",array2];

NSArray *temp1 = [array1 filteredArrayUsingPredicate:predicate1];

結果:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容