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运算符
主要是使用正则表达式,但是计算的开销很大。
Objective-C日记-之NSPredicate的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- objective-c中使用cocoa的NSPredicate,谓词(十四)
holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details ...
- [Proposal]Nano-Diary(纳日记)
[Motivation] 很多人都有记日记的习惯,不为别的,就为了那份情怀.但是也有很多人不记日记,原因是嫌写字麻烦.记得很久很久以前,在<读者>上读过一篇文章,大意是一个人用数值记下每天 ...
- 微信小程序开发日记——高仿知乎日报(下)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 微信小程序开发日记——高仿知乎日报(上)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- Linux学习日记-使用EF6 Code First(四)
一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是 请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...
- NSPredicate 的使用
NSPredicate是什么? NSPredicate 是预测的意思 但是我们常翻译成谓词 它可以干什么? 使用NSPredicate可以定义模糊查询条件 根据一定的条件 我们就可以从一个数组中快速找 ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
随机推荐
- Oracle job调用存储过程
在PL/SQL中的what值中直接写入存储过程的名称+“分号”: begin sys.dbms_job.submit(job => :job, what => 'del_ky_items; ...
- [nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)
1.前言 随机数生成器在通信.加密.图像传输等领域应用广泛,且一般起到关键性作用.我在最近设计的一个近场射频通信协议的碰撞避退算法的过程中,便对此有深深体会. 2.伪随机数发生器 随机数发生器一般包括 ...
- Ajax+存储过程真分页实例解析(10W数据毫秒级+项目解析)
周末闲来无事,突然想写个分页的东西玩玩,说走就走 在文章最后我会把整个项目+数据库附上,下载下来直接运行就可以看效果了.整个项目采用的是简单三层模式,开发平开是VS2010+SQL2012 一.我要做 ...
- SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数
-- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='proc ...
- JavaScript 语法
一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...
- ArcGIS制图技巧系列(1)还原真实的植被
ArcGIS制图技巧系列(1)还原真实的植被 by 李远祥 在GIS数据中,植被一般都是面装要素的形式存在.很多人在使用植被渲染的时候,一般会采用填充符号去渲染.而在ArcGIS中,填充符号要么就是纯 ...
- vue.js 常用语法总结(一)
作者:曾萍,目前就职于京东商城. 概述 2016年已经结束了.你是否会思考一下,自己在过去的一年里是否错过一些重要的东西?不用担心,我们正在回顾那些流行的趋势.通过比较过去12个月里Github所增加 ...
- 二维码 iOS
一:生成二维码 1.根据一个字符串生成一个二维码 根据 #import <CoreImage/CoreImage.h>这个框架写的 在按钮的点击事件写 @interface ViewCo ...
- JAVA--可变长参数
可变长参数: 可变长参数可以接受任意个数的实参,形参实际上是一个数组. 语法形式: 方法名称(类型 参数1,类型 参数2,类型...可变长参数) *可变长参数一定是方法的最后一个参数 public v ...
- bzoj1492--斜率优化DP+cdq分治
显然在某一天要么花完所有钱,要么不花钱. 所以首先想到O(n^2)DP: f[i]=max{f[i-1],(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]*r[j]+b[j])},j& ...