Objective-C日记-之NSPredicate

谓语:NSPredicate

1,概述:

用于设置指定的过滤器的条件,通俗的理解就是设置选择的条件,再对指定的对象应用这个条件

2,用法:

a,首先设置谓语。

NSPredicate *predicate=[NSPredicate predicateWithFormat:"name=='Herbie'"];

它将“name=='Herbie'"谓词字符串赋给谓语,如果文本块未使用单引号引用,则为键路径,如果被引用则为文本块。

b,通过某个对象,计算谓语。

BOOL match=[predicate evaluateWithObject:car](此处是计算YES或NO)

或者

设置谓语和计算按以下:

NSPredicate *predicate=[NSPredicate predicateWithFormat:@"engine.horsepower>150";

match=[predicate evaluateWithObject:car];

3,延伸用法

a,对NSArray使用。

NSArray *results;

results=[cars filteredArrayUsingPredicate:predicate];

b, 对NSMutabArray使用与a用法相似。

4,递进用法

a,使用格式说明符。

将条件设置剥离到条件表达式之外。

predicate=[NSPredicate predicateWithFormat:@"engine.horsepower> %d",150];

predicate=[NSPredicate predicateWithFormat:@"name==%@",@"Herbie"];这里如果要使用%@作为等号后面的条件,则应使用@"name=='%@'",@"Herbie"

b,将变量名放入字符串字典中,类似于环境变量

首先构造临时谓词:predicateTemplate=[NSPredicate predicateWithFormat:@"name==$NAME"];

再构造构造一个字典:NSDictionary *varDict=[NSDictionary dictionaryWithObjectAndKeys:

                  @"Herbie",@"NAME",nil]

再构造新谓词:predicate=[predicateTemplate predicateWithSubstitutionVariables:varDict];

或者如下:

predicateTemplate=[NSPredicate predicateWithFormat:@engine.horsepower > $POWER"];

NSDictionary *varDict=[NSDictionary dictionaryWithObjectAndKeys:

        [NSNumber numberWithInt:150],@"POWER",nil];

predicate=[predicateTemplate predicateWithSubstitutionVariables:varDict];

c,使用运算符

c1,比较和逻辑运算符>,>=,=>,<=,<,<=,=<,!=,<>,(),AND,OR,NOT,&&,||,!

predicate=[NSPredicate predicateWithFormat:@"(engine.horsepower>50) AND (engine.horsepower <200)"];

results=[cars filterdArrayUsingPredicate:predicate];

c2,数组运算符BETWEEN,IN

NSArray *betweens=[NSArray arrayWithObject:

          [NSNumberWithInt:50]

          [NSNumberWithInt:200],nil];

predicate=[NSPredicate predicateWithFormat:

        @"engine.horsepower BETWEEN %@",betweens];

也可以将前面的环境变量的方法运用进来。

c3,将某个字符串数组作为谓语来使用(使用SELF)。

比如,我有一个字符串数组:{"Herbie","Snugs","Badger","Flap"},要将其作为条件在cars.name中查找。

NSArray *names=[cars valueForKey:@"name"];

NSPredicate *predicate=[NSPredicate predicateWithFormat:

              @"SELF IN {'Herbie','Snugs','Badger','Flap'}];

results=[names filteredArrayUsingPredicate:predicate];

谨记这句话:SELF可以引用用于谓词计算的对像。如下:

NSArray *names1=[NSArray arrayWithObjects:

      @"Herbie",@"Badger",@"Judge",@"Elvis",nil];

NSArray *names2=[NSArray arrayWithObjects:

      @"Judge",@"Paper Car",@"Badger",@"Finto",nil];

predicate=[NSPredicate predicateWithFormat:@"SELF IN %@",name1];

results=[names2 filteredArrayUsingPredicate:predicate];

c4,字符串运算符

BEGINWITH,ENDWITH,CONTAINS,

例如使用"name BEGINSWITH 'Bad'"匹配"Badger"

通常还会有修饰符[c]不区分大小写,[d]不区分发音符号,[cd]既不区分大小写,也不区分发音符号,如:

"name BEGINSWITH[cd] 'HERB'"

c5,LIKE运算符

如谓词字符串:"name LIKE '*er*'","name LIKE '???er*'"

c6,MATCHS运算符

主要是使用正则表达式,但是计算的开销很大。

posted @ 2016-07-10 14:12  dbseti  阅读(138)  评论(0编辑  收藏  举报