iOS开发,谓词(NSPredicate)的用法:(一)基本用法

<span style="white-space: pre;">	</span>在iOS开发中,系统提供了NSPredicate这个类给我们进行一些匹配、筛选操作,非常方便。在没有用这个类时,我们要获取两个数组中某些特定的元素时,需要写代码一一对比,但是使用了这个类,只需要三四行代码就够了。

为了演示,先定义一个person类

.h文件

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

- (instancetype)initWithName:(NSString *)name
                         Age:(NSInteger)age;

+(Person *)personWithName: (NSString *)nsme
                      Age: (NSInteger)age;

@end

.m文件

#import "Person.h"

@implementation Person

- (instancetype)initWithName:(NSString *)name Age:(NSInteger)age {
    if (self = [super init]) {
        _name = name;
        _age = age;
    }

    return self;
}

+ (Person *)personWithName:(NSString *)nsme Age:(NSInteger)age {
    Person *person = [[Person alloc] initWithName:nsme Age:age];
    return person;
}

- (NSString *)description {
    return [NSString stringWithFormat:@"name = %@, age = %ld",_name, _age];
}

@end

我在实现文件中重写了description方法,是为了一会在打印筛选结果时能打印出对象属性的值。

然后将person引入main文件中(为了方便演示,没有使用cocoa),创建出10个不同的person对象,并放进数组中。

// 创建出10个person对象,并加入数组
        NSMutableArray *muArray = [NSMutableArray array];
        for (int i = 0; i <10; i++) {
            Person *person = [Person personWithName:[NSString stringWithFormat:@"zhang%d",i] Age:i];
            [muArray addObject:person];

        }
        NSLog(@"muArray = %@", muArray);

ok,准备工作完成,下边主角闪亮登场。

NSPredicate使用时主要分两步走:第一步,定义谓词语句;第二步,根据要求,选择不同的方法执行谓词语句。

首先,我们来定义一个谓词语句,在定义谓词语句时,顺便会介绍谓词的语法。

1)比较运算符

/**比较运算符
         * >:大于
         * <:小于
         * >=:大于等于
         * <=:小于等于
         * =,==:等于
         * !=,<>:不等于
         * between:左边的表达式等于右边的表达式的值或者介于它们之间。右边是一个有两个指定上限和下限的数值的数列(指定顺序的数列)。比如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。
         **/
        // 例子:年龄属性大于3岁,注意:键路径不能用单引号引起来,否则会报错
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];

2)逻辑运算符

        /**逻辑运算符
         * and/&&:与
         * or/||:或
         * not/!:非
         **/
        // 例子:年龄大于三岁或名字叫“zhang1”的,注意:字符串的值需要用单引号引起来,否则会报错,错误信息是:this class is not key value coding-compliant for the key zhang1.
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3 || name = 'zhang1'"];

3)关系运算符

/**关系操作
         *  ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
         *  ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
         *  NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。
         *  IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。
         **/
        // 例子:in关键字:左边的关键字里必须包含右边的集合的元素
         NSPredicate *predicate = [NSPredicate predicateWithFormat:@" name in {'zhang1','zhang4'}"];

4)数组操作

 /**数组操作
         *  array[index]:指定数组中特定索引处的元素。
         *  array[FIRST]:指定数组中的第一个元素。
         *  array[LAST]:指定数组中的最后一个元素。
         *  array[SIZE]:指定数组的大小。
         **/

以上就是对谓词的定义,我们可以看出,我是主要使用了predicateWithFormat:这个类方法进行定义的。

下面进入第二步:执行谓词语句。

1)、过滤对象是数组:使用- (void)filterUsingPredicate:(NSPredicate *)predicate; 针对可变数组进行过滤,过滤掉可变数组中不符合条件的。-
(NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 针对不可变数组进行过滤,将符合条件的元素组成一个新数组进行返回

2)、对单个对象进行判断过滤使用:- (BOOL)evaluateWithObject:(id)object; 向谓词对象发送该方法,参数是过滤的对象。常见于和正则表达式配合使用。

下边分别示范上边的三种方法。

a)、- (void)filterUsingPredicate:(NSPredicate *)predicate; 针对可变数组进行过滤

// 1、创建出10个person对象,并加入数组
        NSMutableArray *muArray = [NSMutableArray array];
        for (int i = 0; i <10; i++) {
            Person *person = [Person personWithName:[NSString stringWithFormat:@"zhang%d",i] Age:i];
            [muArray addObject:person];

        }
        NSLog(@"muArray = %@", muArray);
// 2、定义谓词语句:年龄属性大于3岁,注意:键路径不能用单引号引起来,否则会报错
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];
// 3、对可变数组进行过滤
        [muArray filterUsingPredicate:predicate];
        NSLog(@"可变数组过滤后的结果%@", muArray);

我们可以看到打印的结果是:

2015-06-17 11:58:23.126 NSPredicate[3183:277528] 可变数组过滤后的结果(
    "name = zhang4, age = 4",
    "name = zhang5, age = 5",
    "name = zhang6, age = 6",
    "name = zhang7, age = 7",
    "name = zhang8, age = 8",
    "name = zhang9, age = 9"
)

b)、- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 针对不可变数组进行过滤,将符合条件的元素组成一个新数组进行返回。

 // - (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 针对不可变数组进行过滤,将符合条件的元素组成一个新数组进行返回
        NSArray *beforeFilterArray = [NSArray arrayWithArray:(NSArray *)muArray];
        NSArray *afterFilterArray = [beforeFilterArray filteredArrayUsingPredicate:predicate];
        NSLog(@"不可变数组过滤结果%@", afterFilterArray);

我们可以看到打印结果是:

2015-06-17 11:58:23.126 NSPredicate[3183:277528] 不可变数组过滤结果(
    "name = zhang4, age = 4",
    "name = zhang5, age = 5",
    "name = zhang6, age = 6",
    "name = zhang7, age = 7",
    "name = zhang8, age = 8",
    "name = zhang9, age = 9"
)

c)、- (BOOL)evaluateWithObject:(id)object; 对数组中的每一个元素进行筛选

 NSMutableArray *matchObjArray = [NSMutableArray array];
        for (Person *item in muArray) {
            // A、判断是否满足条件
            // 判断语句:evaluateWithObject,符合过滤条件就返回yes
            if ([predicate evaluateWithObject:item]) {
                [matchObjArray addObject:item];
            }
        }

        NSLog(@"符合过滤条件的对象是:%@", matchObjArray);

筛选结果是:

2015-06-17 11:58:23.125 NSPredicate[3183:277528] 符合过滤条件的对象是:(
    "name = zhang4, age = 4",
    "name = zhang5, age = 5",
    "name = zhang6, age = 6",
    "name = zhang7, age = 7",
    "name = zhang8, age = 8",
    "name = zhang9, age = 9"
)

小结:以上三种方法都可以执行谓词短语,如果是对数组元素进行过滤的话,我们使用:- (void)filterUsingPredicate:(NSPredicate *)predicate、- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;更方便,如果是只针对一个对象进行判断的话,使用-
(BOOL)evaluateWithObject:(id)object; 更方便。

时间: 2024-10-31 04:22:53

iOS开发,谓词(NSPredicate)的用法:(一)基本用法的相关文章

李洪强iOS开发之 - enum与typedef enum的用法

李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的TO_BE_PAID=0,//开始   那么其后的就依次为1,2,3....所以一般只需要设置枚举中第一个的值就可以. 注意: 在定义枚举类型的时候一定要定义在.h中的#imort 和€interface之间定义,位置不能错了 02 - 定义操作类型 enum和enum typedef 在IOS中的使

iOS开发多线程篇 08 —GCD的常见用法

iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispat

iOS 之谓词 NSPredicate

NSPredicate:谓词 NSPredicate的具体用途应该还是过滤,类似于过滤条件之类的. 一.NSpredicate的创建: NSpredicate *predicate  = [NSpredicate  predicateWithFormat:@"age > 28"]; //筛选条件       predicateWithFormat:为类方法 ,不需要我们管理内存. 二.NSpredicate中主要的几种运算方式      1.比较运算符 > .< .=

iOS开发之--NSPredicate

简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; Format:(1)比较运算符>,<,==,>=,<=,!=可用于数值及字符串例:@"number > 100" (2)范围运算符:IN.BETWEEN例:@"

[IOS 开发代码]UIImage+Blur 网络图片模糊用法

UIImage-Helpers 网络图片模糊用法   float quality = .00001f;    float blurred = .5f; NSURL *url = [NSURL URLWithString:@"http://pic21.nipic.com/20120614/10230657_130343324168_2.jpg"]; NSData *data = [[NSData alloc]initWithContentsOfURL:url]; UIImage *img

ios开发之--UITableView中的visibleCells的用法

先上图: 具体代码如下: #import "ViewController.h" @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> @property(nonatomic,strong)UITableView *myTableV; @property(nonatomic,strong)NSArray *contentAry; @end @implementation ViewCont

IOS开发之NSPredicate谓词的用法

编程的人员不管是上过大学还是从培训机构出来的都应该SQL语句有所了解,我们知道,在SQL语句当中 where 条件表达式可以对二维关系表的数据做条件筛选.微软的C# .net中也实现了功能能和SQL语句相媲美的技术,它就是List泛型集合的Lambda表达式,支持查找.排序.比较.组合等.在java中虽然没有在语言中集成对List对象的操作的实现,但是第三方开源库同样实现了这一功能.在IOS开发Cocoa框架中提供了一个功能强大的类NSPredicate,下面来讨论一下它的强大之处在哪...NS

【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词

一. 字符串 API 1. NSString 用法简介 (1) NSString API 介绍 NSString 功能 : -- 创建字符串 : 使用 init 开头的实例方法, 也可以使用 String 开头的方法; // init 开头方法创建字符串 unichar data[5] = {97, 98, 99, 100, 101}; NSString * str = [[NSString alloc] initWithCharacters : data length : 5]; // str

ios开发入门篇(四):UIWebView结合UISearchBar的简单用法

 UIWebView是ios开发中比较常用的一个控件.我们可以用它来浏览网页.打开文档等,今天笔者在这里简单介绍下UIWebView和UISearchBar结合起来的用法,做一个简单的类浏览器. 一:首先定义这两个控件,并在.h文件中实现UISearchBarDelegate,UIWebViewDelegate两个代理 @interface TestView : UIViewController<UISearchBarDelegate,UIWebViewDelegate> @property(