iOS开发-NSPredicate谓词专题


Cocoa提供了一个名为NSPredicate的类,它用于指定过滤器的条件。可以创建NSPredicate对象,通过它准确的描述所需的条件,通过谓词筛选每个对象,判断它们是否与条件相匹配。Cocoa用NSPredicate描述查询的方式,原理类似于在数据库中进行查询,可以在数据库风格的API中使用NSPredicate类,比如Core DataSpotlight

代码示例:

两个对象类:Student和Teacher

//
//  Student.h
//  谓词
//
//  Created by on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject

@property (nonatomic, retain) NSString *stuName;
@property (nonatomic, assign) NSInteger stuAge;

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;

@end
//
//  Student.m
//  谓词
//
//  Created by on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import "Student.h"

@implementation Student

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
    if (self = [super init]) {
        _stuName = name;
        _stuAge = age;
    }
    return self;
}

@end
//
//  Teacher.h
//  谓词
//
//  Created by on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>

@class Student;

@interface Teacher : NSObject

@property (nonatomic, strong) Student *student;
@property (nonatomic, retain) NSString *teaName;
@property (nonatomic, assign) NSInteger teaAge;

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;

@end
//
//  Teacher.m
//  谓词
//
//  Created by wujiafeng on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import "Teacher.h"

@implementation Teacher

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
    if (self = [super init]) {
        _teaName = name;
        _teaAge = age;
    }
    return self;
}

@end

测试:

//
//  main.m
//  谓词
//
//  Created by wujiafeng on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *stu = [[Student alloc] initWithName:@"Jack" andAge:12];
        Teacher *teacher = [[Teacher alloc] initWithName:@"Tom" andAge:20];
        
//        设置teacher中的student对象
        teacher.student = stu;
        
//        创建谓词
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"student._stuName == 'Jack'"];
//        通知接收对象(即谓词)根据指定的对象计算自身的值
        BOOL match = [predicate evaluateWithObject:teacher];
        NSLog(@"%s", (match) ? "YES" : "NO");
        
        
        NSMutableArray *stuArray = [NSMutableArray arrayWithCapacity:10];
        for (int i = 0; i < 10; i++) {
            Student *studentTemp = [[Student alloc] initWithName:[NSString stringWithFormat:@"jack%d", i] andAge:20 + i];
            [stuArray addObject:studentTemp];
        }
        
        NSPredicate *pre = [NSPredicate predicateWithFormat:@"_stuAge > 25"];
//        迭代出年龄大于25岁的学生信息
        for (Student *temp in stuArray) {
            if ([pre evaluateWithObject:temp]) {
                NSLog(@"姓名:%@,年龄:%ld", temp.stuName, temp.stuAge);
            }
        }
        
//        调用数组过滤器实现过滤
//        此方法会返回一个NSArray数组
        NSArray *stus = [stuArray filteredArrayUsingPredicate:pre];
        
//        此方法是直接从NSMutableArray中过滤掉不满足条件的项
        [stuArray filterUsingPredicate:pre];
//        KVC的运用
        NSArray *stuNamesForMutable = [stuArray valueForKey:@"stuName"];
        NSLog(@"%@", stuNamesForMutable);
        
        NSLog(@"=======调用数组方法处理=======");
        for (Student *temp in stus) {
            NSLog(@"姓名:%@,年龄:%ld", temp.stuName, temp.stuAge);
        }
        
//        KVC的运用
        NSArray *arryForStuName = [stus valueForKey:@"stuName"];
        NSLog(@"%@", arryForStuName);
        
        pre = [NSPredicate predicateWithFormat:@"_stuName == %@", @"Tom"];
//        这里的%K指的是键路径
        pre = [NSPredicate predicateWithFormat:@"%K == %@", @"_stuName", @"Tom"];
        
        
//        另一种方式是将变量名放入字符串中,类似于环境变量
        NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"_stuName == $NAME"];
//        这里键是变量名(不包括美元符号),这里用字符串Jack作为键“NAME”的值
        NSDictionary *varDic = [NSDictionary dictionaryWithObjectsAndKeys:@"Jack", @"NAME", nil];
        pre = [predicateTemplate predicateWithSubstitutionVariables:varDic];
        BOOL match1 = [pre evaluateWithObject:stu];
        NSLog(@"%s", (match1) ? "YES" : "NO");
    }
    return 0;
}

输出结果如下:

2015-03-16 18:30:23.938 谓词[581:15147] YES

2015-03-16 18:30:23.939 谓词[581:15147] 姓名:jack6,年龄:26

2015-03-16 18:30:23.939 谓词[581:15147] 姓名:jack7,年龄:27

2015-03-16 18:30:23.939 谓词[581:15147] 姓名:jack8,年龄:28

2015-03-16 18:30:23.939 谓词[581:15147] 姓名:jack9,年龄:29

2015-03-16 18:30:23.939 谓词[581:15147] (
jack6,
jack7,
jack8,
jack9
)

2015-03-16 18:30:23.939 谓词[581:15147] =======调用数组方法处理=======

2015-03-16 18:30:23.939 谓词[581:15147] 姓名:jack6,年龄:26

2015-03-16 18:30:23.940 谓词[581:15147] 姓名:jack7,年龄:27

2015-03-16 18:30:23.940 谓词[581:15147] 姓名:jack8,年龄:28

2015-03-16 18:30:23.940 谓词[581:15147] 姓名:jack9,年龄:29

2015-03-16 18:30:23.940 谓词[581:15147] (
jack6,
jack7,
jack8,
jack9
)
2015-03-16 18:30:23.940 谓词[581:15147] YES

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 转载自:http://www.cocoachina.com/ios/20160111/14926.html 1、大...
    一笔春秋阅读 2,835评论 0 2
  • 点 击 ➡️ 含泪的 眼 点 击 ➡️ 他山之石,亦有璞玉 点 击 ➡️...
    小义子_正版阅读 350评论 0 0
  • 故事:河边的苹果。 昨晚九点多到十一点多,一个半小时的时间,升华、录音。录着录着有点着急了,越说越不成型。还是得提...
    斑马_b1e3阅读 191评论 0 0
  • 最近在读《街道与广场》,其中绪论中有句原文为“城市规划可以定义为资源分配的过程”。最近2016年普立兹奖得主智利建...
    自语者阅读 616评论 0 0
  • 【也许,父母子女之间的缘份,就是一场渐行渐远的别离。】 01 回家 清明节,我又回到了老家,一是扫墓,二是看看父亲...
    富兰克刘阅读 584评论 8 7