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运算符

主要是使用正则表达式,但是计算的开销很大。

时间: 2024-07-29 03:07:05

Objective-C日记-之NSPredicate的相关文章

[Proposal]Nano-Diary(纳日记)

[Motivation] 很多人都有记日记的习惯,不为别的,就为了那份情怀.但是也有很多人不记日记,原因是嫌写字麻烦.记得很久很久以前,在<读者>上读过一篇文章,大意是一个人用数值记下每天的心情,最后记多了就形成一个起起落落的折线图.从折线图中可以看出低谷和高峰,不管是正处于低谷还是高峰,都借此提醒自己,一切都会过去.受这篇文章影响,我本人也有这种习惯,我的日记就是对今天的一个评分,比记录文字简便多了.之前是写在纸上,但是掏出纸笔的动作让我觉得很烦:现在是记在Evernote上,但是仍然要重复

C++ Objective C Java C 详细比较和区别

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net primitive types | arithmetic and logic | strings | regexes | dates and time | arrays | dictionaries | functions execution control | files | directories | processes and

小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相信] 一个端口就是一个潜在的通信通道,也就是一个入侵通道.对目标计算机进行端口扫描,能得到许多有用的信息.进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行扫描.在手工进行扫描时,需要熟悉各种命令.对命令执行后的输出进行分析.用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能.通过

小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议,arp协议属于二层协议,它是基于广播的,所以不可路由.而ICMP协议是可以路由的,理论上可以使用icmp协议发现全球的ip,如果没有边界防火墙(禁止icmp的探测包)进行过滤的话,对目标主机进行扫描,则会收到相应的响应,从而进行捕捉[有边界防火墙的现象比较普遍],但是三层发现的扫描速度也较二层要慢

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

天天写日记争当文艺青年 2014-5-21

纠结啊为毛感觉只过了一天,就有两天没写了,今天晚上的机票离开上海.希望小叶子不会难为我. 昨晚研究了一下插卡小哥的业务流程,发现他并不是每个房间都插的,时间在每晚的9点到11点之间.估计是会在周边每个宾馆巡回一遍,插广告的房间有两种可能,第一种就是他们和宾馆沆瀣一气,知道哪个房间有人,第二种可能就是他们只给大床房的房间发,7天没有单间所以单身旅客一般会选择大床房,这绝对是优质潜在用户哇. 晚上看了个 正者无敌 还挺好看的样子,里面男主娶了3房姨太太,不错不错~ 晚上做了个梦,醒来后还是格外清晰,

学习日记

五一耍了三天,自己的计划有泡汤,那种制止力哪里去了,不过我认真起来还有有废寝忘食的时候,不过希望这种时候多一点,回家妈妈告诉我,她给老师打电话了的,老师说了我的一些情况,不过我没有老师说的那么好,学习在班上算中等.我觉得还算不上吧!任重而道远吧. Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量

windows 下部署kafka 日记 转

windows 下部署kafka 日记 转一.下载去apache 的官网(http://kafka.apache.org/downloads.html)下载最新的二进制版的压缩包.目前的最新版本是kafka_2.11-0.8.2.1.tgz.二.解压直接解压到D 盘根目录下.三.修改配置文件注意版本不同,可能配置文件不同.请参照实际情况修改.1.修改log4j.properties 文件中的“kafka.logs.dir=logs ”为“kafka.logs.dir=/tmp/logs”.2.修

Python爬虫个人记录(四)利用Python在豆瓣上写一篇日记

涉及关键词:requests库 requests.post方法 cookies登陆 一.目的分析 利用cookie登陆豆瓣,并写一篇日记 https://www.douban.com/note/636142594/ 二.步骤分析 1.使用浏览器登陆豆瓣,得到并分析cookie 2.使用cookie模拟登陆豆瓣(使用账号密码登陆也可以,需要验证码,cookie的时效一般就几天) 3.分析浏览器写日记行为,在python中模拟post行为 4.源码及测试 三.scrapy shell 模拟登陆 1.