OC学习篇之---谓词(NSPredicate)
在前一篇文章中我们介绍了OC中一个重要技术通知:http://blog.csdn.net/jiangwei0910410003/article/details/41923401,今天我们在来看一下OC中给我们提供的一个技术:谓词(NSPredicate)
OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据。非常方便。在Java中是没有这种技术的,但是有开源的框架已经实现了此功能。
下面来看一下具体的例子吧:
Person.h
//
// Person.h
// 46_NSPredicate
//
// Created by jiangwei on 14-10-18.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> @interface Person : NSObject @property NSString *name;
@property NSInteger age; + (id)personWithName:(NSString *)name andAge:(NSInteger)age; @end
Person.m
//
// Person.m
// 46_NSPredicate
//
// Created by jiangwei on 14-10-18.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import "Person.h" @implementation Person + (id)personWithName:(NSString *)name andAge:(NSInteger)age{
Person *person = [[Person alloc] init];
person.name = name;
person.age = age;
return person;
} - (NSString *)description{
NSString *s =[NSString stringWithFormat:@"name=%@,age=%ld",_name,_age];
return s;
} @end
我们在Person类中定义属性,还有一个产生对象的类方法,同时重写了description方法,用于打印结果
测试方法
main.m
//
// main.m
// 46_NSPredicate
//
// Created by jiangwei on 14-10-18.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Person.h" //谓词,指定过滤器的条件,将符合条件的对象保留下来
//一般用谓词过滤数组中指定的元素
int main(int argc, const char * argv[]) {
@autoreleasepool { NSArray *persons = [NSArray arrayWithObjects:
[Person personWithName:@"mac" andAge:20],
[Person personWithName:@"1" andAge:30],
[Person personWithName:@"2" andAge:40],
[Person personWithName:@"3" andAge:50],
[Person personWithName:@"4" andAge:60],
[Person personWithName:@"5" andAge:70],
[Person personWithName:@"6" andAge:20],
[Person personWithName:@"7" andAge:40],
[Person personWithName:@"8" andAge:60],
[Person personWithName:@"9" andAge:40],
[Person personWithName:@"0" andAge:80],
[Person personWithName:@"10" andAge:90],
[Person personWithName:@"1" andAge:20]]; //年龄小于30
//定义谓词对象,谓词对象中包含了过滤条件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];
//使用谓词条件过滤数组中的元素,过滤之后返回查询的结果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray=%@",array); //查询name=1的并且age大于40
predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"];
array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray=%@",array); //in(包含)
predicate = [NSPredicate predicateWithFormat:@"self.name IN {'1','2','4'} || self.age IN{30,40}"]; //name以a开头的
predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];
//name以ba结尾的
predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"]; //name中包含字符a的
predicate = [NSPredicate predicateWithFormat:@"name CONTAINS 'a'"]; //like 匹配任意多个字符
//name中只要有s字符就满足条件
predicate = [NSPredicate predicateWithFormat:@"name like '*s*'"];
//?代表一个字符,下面的查询条件是:name中第二个字符是s的
predicate = [NSPredicate predicateWithFormat:@"name like '?s'"]; }
return 0;
}
首先我们看到,我们初始化了一定大小的数组。
然后我们就可以使用NSPredicate类进行过滤操作了
1、查询数组中年龄小于30的对象
//年龄小于30
//定义谓词对象,谓词对象中包含了过滤条件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];
//使用谓词条件过滤数组中的元素,过滤之后返回查询的结果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray=%@",array);
首先创立一个过滤条件:
//定义谓词对象,谓词对象中包含了过滤条件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];
这里面操作很简单的:@"age<%d",这个age是Person的属性名,%d相当于占位符,然后后面用参数替换即可
然后进行过滤操作,返回一个过滤之后的数组对象
//使用谓词条件过滤数组中的元素,过滤之后返回查询的结果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];
2、查询name=1并且age大于40的集合
//查询name=1的并且age大于40
predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"];
array = [persons filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray=%@",array);
当然我们也可以使用&&进行多条件过滤
3、包含语句的使用
//in(包含)
predicate = [NSPredicate predicateWithFormat:@"self.name IN {'1','2','4'} || self.age IN{30,40}"];
4、指定字符开头和指定字符结尾,是否包含指定字符
//name以a开头的
predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];
//name以ba结尾的
predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"]; //name中包含字符a的
predicate = [NSPredicate predicateWithFormat:@"name CONTAINS 'a'"];
5、like进行匹配多个字符
//like 匹配任意多个字符
//name中只要有s字符就满足条件
predicate = [NSPredicate predicateWithFormat:@"name like '*s*'"];
//?代表一个字符,下面的查询条件是:name中第二个字符是s的
predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];
总结
这一篇就介绍了OC中常用的技术:谓词的使用,他用起来很方便的,而且也没什么难度,和我们当初在操作数据库的时候很想,但是他对我们进行过滤操作提供了很大的便捷。
OC学习篇之---谓词(NSPredicate)的更多相关文章
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- OC学习篇之---单例模式
在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...
- (转载)OC学习篇之---概述
前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- (转载)OC学习篇之---第一个程序HelloWorld
之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...
- OC学习篇之---第一个程序HelloWorld
从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这里最好还是Java).在干活之前,得先找到 ...
- OC学习篇之---内存管理介绍和使用
在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...
- OC学习篇之---类的三大特性(封装,继承,多态)
之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...
- (转载)OC学习篇之---归档和解挡
前几篇文章说到了OC中的Foundation框架,今天我们来看一下OC中的一个重要知识点:归档 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOu ...
随机推荐
- 【LeetCode 76】最小覆盖子串
题目链接 [题解] 尺取法. 用l和r代表一个合法的覆盖子串. 我们不断地扩大右指针. 直到l..r包含T中的所有字母为止(重复的就要两次以上.) 然后我们可以尝试的让l++. 看看新的l..r是不是 ...
- linux0.11源码内核——系统调用,int80的实现细节
linux0.11添加系统调用的步骤 假设添加一个系统调用foo() 1.修改include/linux/sys.h 添加声明 extern int foo(); 同时在sys_call_table数 ...
- python中的_ElementUnicodeResult是什么
_ElementUnicodeResult在python中是字符串的一种,因为在python3中,字符串就是指以unicode编码规则存储的数据,而以其他方式如utf-8,ASCII编码方式存储的数据 ...
- 单片机程序第一句ORG 0030H什么意思
ORG是伪指令,告诉 编译 器,程序从ROM的0000开始存放程序,但是AJMP MAIN是一条无条件跳转指令,也就是说,单片机上电之后首先从0000处开始执行程序,但是,AJMP直接将程序跳转到MA ...
- linux中yum install 命令无效
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lx_Frolf/article/deta ...
- Asp.Net Core 第06局:中间件
总目录 前言 本文介绍Asp.Net Core 中间件. 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 第一手:中间件概述 1.中间件:添加到应用 ...
- Gcd的原理理解
Ps:最小公倍数=a*b/gcd(a,b) a除以b的商为p,余数为q,a=b*p+q,gcd(b,q)可以整除a和b,因此gcd(b,q)也能整除gcd(a,b):反过来,gcd(a,b)也能整除g ...
- 嵌入式C语言3.4 关键字---类型描述符auto/register/static/const/extern/volatile/
对内存资源存放位置的限定 1. auto 默认值---分配的内存都是可读可写的区域 auto int a; 区域如果出现 {} 我们认为在栈空间 2. register register int a; ...
- CSS实现文字阴影的效果
CSS中有两种阴影效果,一种是DropShadow(投影),另一种是Shadow(阴影).1.DropShadow语法:{FILTER:DropShadow(Color=color,OffX=offX ...
- Java并发Lock接口
java.util.concurrent.locks.Lock接口用作线程同步机制,类似于同步块.新的锁定机制更灵活,提供比同步块更多的选项. 锁和同步块之间的主要区别如下: 序列的保证 - 同步块不 ...