NSPredicate類是用來定義邏輯條件約束的獲取或內(nèi)存中的過濾搜索猾瘸。
一界赔、NSPredicate的基本用法
1.比較運算符
- =、==:判斷兩個表達式是否相等牵触,在謂詞中=和==是相同的意思淮悼,沒有賦值一說。
- >=揽思、=>:判斷左邊的值是否大于或等于右邊
- <=袜腥、=<:判斷左邊的值是否小于或等于右邊
- >:判斷左邊的值是否大于右邊
- <:判斷左邊的值是否小于右邊
- !=、<>:判斷兩個表達式是否不相等
- BETWEEN:BETWEEN表達式必須滿足表達式 BETWEEN {下限钉汗,上限}的格式羹令,要求該表達式必須大于或等于下限,并小于或等于上限
NSNumber *number = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self = 123"];
BOOL result = [predicate evaluateWithObject:number];
//result is YES
NSNumber *number = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self between {123, 200}"];
BOOL result = [predicate evaluateWithObject:number];
//result is YES
2.比較運算符
- AND儡湾、&&:邏輯與
- OR特恬、||:邏輯或
- NOT、!:邏輯非
NSArray *array = @[@1, @2, @3, @4, @5, @6, @7];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 2 && self < 5"];
NSArray *filterArray = [array filteredArrayUsingPredicate:predicate];
//filterArray is @[@3, @4];
3.字符串比較運算符
- BEGINSWITH:是否以指定字符串開頭徐钠;
- ENDSWITH:是否以指定字符串結(jié)尾癌刽;
- CONTAINS:是否包含指定字符串;
- LIKE:是否匹配指定字符串模版尝丐;
- MATCHES:是否匹配指定的正則表達式显拜;
1.以abc開頭:beginswith 'abc'; </br> 2.匹配模版:"name like 'abc'":表示name的值中包含abc則返回YES;"name like '?abc*'":表示name的第2爹袁、3远荠、4個字符為abc時返回YES;</br>3.正則表達式的效率最低失息,但功能最強大譬淳。
字符串比較都是區(qū)分大小寫和重音符號的档址。如:café和cafe是不一樣的,Cafe和cafe也是不一樣的。如果希望字符串比較運算不區(qū)分大小寫和重音符號,請在這些運算符后使用[c]站粟,[d]選項。其中[c]是不區(qū)分大小寫尼摹,[d]是不區(qū)分重音符號,其寫在字符串比較運算符之后剂娄,比如:name LIKE[cd] 'cafe'蠢涝,那么不論name是cafe、Cafe還是café上面的表達式都會返回YES阅懦。
4.集合運算符
- ANY和二、SOME:集合中任意一個元素滿足條件,就返回YES耳胎。
- ALL:集合中所有的元素都滿足條件儿咱,才返回YES。
- NONE:集合中沒有任何元素滿足條件就返回YES场晶。
- IN:等價于SQL語句中的IN運算符。
NSArray *array = @[@1, @2, @3, @4, @5, @6, @7];
NSArray *filterArray = @[@1, @4, @8];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self in %@)", filterArray];
NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
//resultArray is @[@2, @3, @5, @6, @7];
5.保留字
AND怠缸、OR诗轻、IN、NOT揭北、ALL扳炬、ANY、SOME搔体、NONE恨樟、LIKE、CASEINSENSITIVE疚俱、CI劝术、MATCHES、CONTAINS呆奕、BEGINSWITH养晋、ENDSWITH、BETWEEN梁钾、NULL绳泉、NIL、SELF姆泻、TRUE零酪、YES冒嫡、FALSE、NO四苇、FIRST孝凌、LAST、SIZE蛔琅、ANYKEY胎许、SUBQUERY、CAST罗售、TRUEPREDICATE辜窑、FALSEPREDICATE
注:雖然大小寫都可以,但是更推薦使用大寫來表示這些保留字
謂詞用法
1.判斷模型符合條件
首先定義一個模型
Person.h
@interface Person : NSObject
@property (nonatomic, copy ) NSString *name;
@property (nonatomic, assign) NSInteger age;
+(instancetype)Person:(NSString *)name Age:(NSInteger)age;
@end
ViewController.h
Person *person = [Person Person:@"張三" Age:15];
//1.判斷姓名是否以“張”開頭
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"name like '張*'"];//name必須是模型中已存在的屬性
BOOL result = [predicate1 evaluateWithObject:person];
//result is YES
//2.判斷年齡是否大于25
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"age > 25"]; //age必須是模型中已存在的屬性
result = [predicate2 evaluateWithObject:person];
//result is NO
2.判斷手機號
- (BOOL)checkPhoneNumber:(NSString *)phoneNumber {
NSString *regex = @"^[1][3-8]\\d{9}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:phoneNumber];
}
3.篩選數(shù)組
NSMutableArray *arrayM = [@[@20, @40, @50, @30, @60, @70] mutableCopy];
// 過濾大于50的值
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF > 50"];
//該方法只有可變數(shù)組才有寨躁,不可變數(shù)組沒有此方法
[arrayM filterUsingPredicate:pred1];
4.篩選數(shù)組中的模型
NSArray *array = @[[Person Person:@"張三" Age:12],
[Person Person:@"張云" Age:24],
[Person Person:@"李四" Age:25]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains '張'"];
NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
//resultArray is "[name = 張三, age = 12], [name = 張云, age = 24]"
5.謂詞中的占位符參數(shù)
%K:用于動態(tài)傳入屬性名
%@:用于動態(tài)設置屬性值
$VALUE:個人感覺是在聲明變量
NSArray *array = @[[Person Person:@"張三" Age:12],
[Person Person:@"張云" Age:24],
[Person Person:@"李四" Age:25]];
NSString *property = @"name";
NSString *value = @"張";
//1.篩選出名字中包含"張"的;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K contains %@", property, value];
NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
//resultArray is "[name = 張三, age = 12], [name = 張云, age = 24]"
//2.篩選出年齡大于24的;
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K > $Value", @"age"];
//必須加上下面這句穆碎,不然會報錯。$Value(Value可以隨便改职恳,統(tǒng)一就行)個人感覺是聲明一個變量所禀,下面是給變量賦值。
predicate2 = [predicate2 predicateWithSubstitutionVariables:@{@"Value":@24}];
NSArray *resultArray2 = [array filteredArrayUsingPredicate:predicate2];
//resultArray2 is "[name = 李四, age = 25]"