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];
結果: