iOS开发-属性含义与用法iOS开发-数据操作ios 知识点

iOS中的谓词(NSPredicate)使用

2017-02-21  本文已影响1154人  George2016

NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。

一、NSPredicate的基本用法

1.比较运算符

    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.比较运算符

    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.字符串比较运算符

1.以abc开头:beginswith 'abc'; </br> 2.匹配模版:"name like 'abc'":表示name的值中包含abc则返回YES;"name like '?abc*'":表示name的第2、3、4个字符为abc时返回YES;</br>3.正则表达式的效率最低,但功能最强大。

字符串比较都是区分大小写和重音符号的。如:café和cafe是不一样的,Cafe和cafe也是不一样的。如果希望字符串比较运算不区分大小写和重音符号,请在这些运算符后使用[c],[d]选项。其中[c]是不区分大小写,[d]是不区分重音符号,其写在字符串比较运算符之后,比如:name LIKE[cd] 'cafe',那么不论name是cafe、Cafe还是café上面的表达式都会返回YES。

4.集合运算符

    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.筛选数组

    NSMutableArray *arrayM = [@[@20, @40, @50, @30, @60, @70] mutableCopy];
    //  过滤大于50的值
    NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF > 50"];
    //该方法只有可变数组才有,不可变数组没有此方法
    [arrayM filterUsingPredicate:pred1];

4.筛选数组中的模型

    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.谓词中的占位符参数

%K:用于动态传入属性名
%@:用于动态设置属性值
$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可以随便改,统一就行)个人感觉是声明一个变量,下面是给变量赋值。
    predicate2 = [predicate2 predicateWithSubstitutionVariables:@{@"Value":@24}];
    NSArray *resultArray2 = [array filteredArrayUsingPredicate:predicate2];
    //resultArray2 is "[name = 李四, age = 25]"
上一篇 下一篇

猜你喜欢

热点阅读