NSPredicate
NSPredicate(謂詞),可以根據(jù)定義的模糊查詢條件举农,對內(nèi)存對象進(jìn)行過濾搜索。
基本語法
- 謂詞表達(dá)式 : 由表達(dá)式敞嗡、運(yùn)算符和值構(gòu)成颁糟。
- 值:
FALSE、NO:代表邏輯假
TRUE喉悴、YES:代表邏輯真
NULL棱貌、NIL:代表空值
SELF:代表正在被判斷的對象自身
"string"或'string':代表字符串
數(shù)組:和c中的寫法相同,如:{'one', 'two', 'three'}箕肃。
數(shù)值:包括證書婚脱、小數(shù)和科學(xué)計數(shù)法表示的形式
十六進(jìn)制數(shù):0x開頭的數(shù)字
八進(jìn)制:0o開頭的數(shù)字
二進(jìn)制:0b開頭的數(shù)字-
運(yùn)算符:
常見用途
1.使用謂詞進(jìn)行正則匹配,例如:
匹配手機(jī)號
- (BOOL)checkPhoneNumber:(NSString *)phoneNumber
{
NSString *regex = @"^[1][3-8]\\d{9}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:phoneNumber];
}
驗證郵箱
+ (BOOL)validateEmail:(NSString *)email{
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:email];
}
ps:使用正則匹配時勺像,更推薦使用NSRegularExpression而不是NSPredicate障贸,因為NSPredicate對某些表達(dá)式的匹配結(jié)果并不盡如人意。
正則相關(guān):正則表達(dá)式在IOS中的應(yīng)用
2.使用謂詞過濾集合
- NSArray提供了如下方法使用謂詞來過濾集合
//使用指定的謂詞過濾NSArray集合吟宦,返回符合條件的元素組成的新集合
- (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate;
- NSMutableArray提供了如下方法使用謂詞來過濾集合
//使用指定的謂詞過濾NSMutableArray篮洁,剔除集合中不符合條件的元素
- (void)filterUsingPredicate:(NSPredicate *)predicate;
- NSSet提供了如下方法使用謂詞來過濾集合
//使用指定的謂詞過濾NSSet集合,返回符合條件的元素組成的新集合
- (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate;
- NSMutableSet提供了如下方法使用謂詞來過濾集合
//使用指定的謂詞過濾NSMutableSet殃姓,剔除集合中不符合條件的元素
- (void)filterUsingPredicate:(NSPredicate *)predicate;
- NSOrderedSet提供了如下方法使用謂詞來過濾集合
//使用指定的謂詞過濾NSOrderedSet集合袁波,返回符合條件的元素組成的新集合
- (NSOrderedSet<ObjectType> *)filteredOrderedSetUsingPredicate:(NSPredicate *)p;
- NSMutableOrderedSet提供了如下方法使用謂詞來過濾集合
//使用指定的謂詞過濾NSMutableOrderedSet,剔除集合中不符合條件的元素
- (void)filterUsingPredicate:(NSPredicate *)p;
- 以上方法都可以在NSPredicate.h文件中找到蜗侈。
使用示例:
創(chuàng)建數(shù)組篷牌,數(shù)組中的元素包含name和age兩個屬性
NSArray *persons = ...
定義謂詞對象,謂詞對象中包含了過濾條件
(過濾條件中踏幻,使用self.name和直接用name的效果一樣)
//age小于30
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<30"];
//查詢name=1的并且age大于40
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"];
//name以a開頭的
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];
//name以ba結(jié)尾的
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"];
//name為1/2/4枷颊,或者age為30/40
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN {'1','2','4'} || age IN{30,40}"];
//like 匹配任意多個字符
//name中只要有s字符就滿足條件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '*s*'"];
//?代表一個字符,下面的查詢條件是:name中第二個字符是s的
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];
使用謂詞條件過濾數(shù)組中的元素该面,過濾之后返回查詢的結(jié)果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
- 謂詞的表達(dá)式中夭苗,如果要動態(tài)修改條件,可以使用占位符:
在使用時吆倦,如果需要拼接屬性名听诸,其占位符為%K(注意大寫)而不是%@坐求,如:
NSString * key = @"age";
int age = 30;
//拼接示例:
[NSPredicate predicateWithFormat:@"%K < %d", key, age];
如果想動態(tài)改變判斷的范圍蚕泽,可以使用$ 開頭的占位符:
//用$AGE進(jìn)行占位,可以動態(tài)修改$對應(yīng)的值,這里的AGE可以是任意字符串
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < $AGE"];
//修改AGE的值(AGE對應(yīng)上面的$后的字符串)须妻,生成新的NSPredicate對象
NSPredicate *newPredicate = [predicate predicateWithSubstitutionVariables:@{@"AGE":@30}];
//使用newPredicate過濾數(shù)組
NSArray *array = [persons filteredArrayUsingPredicate: newPredicate];
PS:個人感覺用字符串拼接的方式設(shè)置表達(dá)式的自由度更高仔蝌。