首页 > 白话Objective-C > 白话Objective-C之NSPredicate

白话Objective-C之NSPredicate

筛选是一项非常基本跟常用的功能,比如我们在搜索栏输入文字进行搜索,就是筛选出符合我们条件的结果。

Cocoa用NSPredicate描述查询的方式,原理类似于在数据库中进行查询。NSPredicate用于筛选符合我们条件的结果,我们可以使用NSPredicate进行自定义筛选。

下面假设car是一个对象

一、NSPredicate在Object里面进行筛选

1、首先定义NSPredicate变量

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

2、在object里面筛选,使用valueForKeyPath的方法判断key path为name的值是否为Herbie。若是返回YES,否返回NO

BOOL match = [predicate evaluateWithObject: car];
NSLog (@"%s", (match) ? "YES" : "NO");

注意:

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

等价于:

predicate = [NSPredicate predicateWithFormat: @"name == %@", @"Herbie"];

另外一个例子:判断key path为engine horsepower的值是否大于150

predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];
match = [predicate evaluateWithObject: car];

二、NSPredicate在array里面进行筛选

NSPredicate *predicate; predicate = [NSPredicate predicateWithFormat: @"name == 'Herbie'"];
NSArray *results;
results = [cars filteredArrayUsingPredicate: predicate];
NSLog (@"%@", results);

如果是NSMutableArray,还可以用filterUsingPredicate直接在本数组里面进行筛选,并同时去除不符合条件的数组元素。

NSMutableArray *carsCopy = [cars mutableCopy];
[carsCopy filterUsingPredicate: predicate];

三、关于SELF

前面的数组中放的都是对象,如果数组放的都是字符串(或者是其他没有属性的类型),该
怎么写谓词呢?这里我们使用SELF。
例:

NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];

四、关于运算符

1、NSPredicate支持一些比较运算符,比如< == > 等

2、逻辑运算符 AND, OR,  NOT, 这些的符号可以表示为 &&, ||,  !

predicate = [NSPredicate predicateWithFormat:  @"(engine.horsepower > 50) AND (engine.horsepower< 200)"];
results = [cars filteredArrayUsingPredicate: predicate];
NSLog (@"oop %@", results);

3、范围运算符:BETWEEN、IN

predicate = [NSPredicate predicateWithFormat:@"engine.horsepower BETWEEN { 50, 200 }"];
predicate = [NSPredicate predicateWithFormat:@"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];

五、关于字符串操作

1、BEGINSWITH 匹配前缀  ENDSWITH 匹配后缀  CONTAINS 匹配整个字符串
附加符号,c表示不区分大小写,d表示不区分发音字符,cd表示什么都不区分

predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'Bad'"];
results = [cars filteredArrayUsingPredicate: predicate];
NSLog (@"%@", results);

2、LIKE运算符(通配符)

//将会匹配中间包含er的字符串,等价于CONTAINS

predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '*er*'"];
results = [cars filteredArrayUsingPredicate: predicate];
NSLog (@"%@", results);

//predicate匹配“Paper Car”,因为开始有三个字符,然后是er

predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '???er*'"];
results = [cars filteredArrayUsingPredicate: predicate];
NSLog (@"%@", results);

(转载本站文章请注明出处 www.helloitworks.com ,请勿用于任何商业用途)

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.