说明:
Cocoa
提供了一个名为NSPredicate
的类,用于指定过滤器的条件。
原理:可以创建NSPredicate
对象,通过它准确描述所需的条件,通过谓词
(计算真值和假值的函数)筛选每个对象,判断它们是否与条件相匹配。
20.1 创建谓词
说明:使用
谓词
有两种方式
方式 | 适用 |
---|---|
创建许多NSPredicate 对象,组合使用 |
构建通用用户界面来指定查询的场景 |
谓词字符串 | 适用于初学者使用,比较简单 |
建议:通常将以使用
面向字符串
的API
,尤其是在缺少编译器的错误检查和奇怪的运行时错误的时候。
predicateWithFormat工厂方法
说明:基于
谓词字符串
在后台构建对象数
,创建谓词
。
谓词字符串:用途类似sql
,语法类似标准c语言表达式
原型:NSPredicate
1 | /** |
1 | // 汽车集合 |
20.2 计算谓词
evaluateWithObject实例方法
说明:通知接收对象(即
谓词
)根据指定的对象
计算自身的值。
用途:计算某个对象
是否符合某个谓词
中的判断逻辑。
原型:``
1 | /** |
1 | // 谓词1:过滤 name 属性值为 Herbie 的车 |
20.3 数组过滤器
说明:某些
类别
将谓词过滤方法
添加到了Cocoa
集合类(比如NSArray
)中。
filteredArrayUsingPredicate实例方法
说明:循环过滤数组内容,根据
谓词
计算每个对象的值,并将值为YES
的对象累计到将被放回的新数组中。
1 | /* 数组过滤 */ |
filterUsingPredicate实例方法
说明:通过
谓词
剔除可变数组中计算结果不为真的对象。
原型:NSMutableArray
1 | /** |
1 | //------------------可变数组过滤 |
20.4 格式说明符
说明:硬编码并非好事,可以通过两种方式将不同的内同放入
谓词格式字符串
中
- 格式说明符:
%格式说明符
- 变量名:
$变量名
20.4.1 格式说明符
说明:分3种
分类 | 说明 | 备注 |
---|---|---|
printf说明符 | c 语言使用的格式说明符 |
%d 、%f 等 |
%@ |
插入O-C 字符串值 |
|
%K |
插入键路径 |
1 | // 使用printf式格式字符串 |
20.4.2 插入变量名
说明:需要配合
字典
和predicateWithSubstitutionVariables
实例方法一起使用。
predicateWithSubstitutionVariables
说明:通过已有的
谓词
(谓词字符串
中包含插入的变量名)创建更加具体的专用谓词
。
原型:NSPredicate
1 | /** |
1 | // 将字典的键名插入到谓词字符串中 |
1 | predicateTemplate = [NSPredicate predicateWithFormat:@"engine.horsepower > $POWER"]; |
20.5 运算符
说明:
NSPredicate
的格式串中包含大量不同的运算符。
注意:本章将介绍大多数运算符,其余的可以通过苹果公司的在线文档
进行查询。
20.5.1 比较和逻辑运算符
说明:
谓词字符串
语法支持C
语言中一些常用的运算符
- 等号运算符:
==
- 不等号运算符:
>
、<=
、!=
等- 赋值运算符:
=
- 逻辑运算符:
AND(&&)
、OR(||)
、NOT(!)
20.5.1.1 比较运算符
说明:包括
等号运算符
和不等号运算符
。
运算符 | 说明 |
---|---|
== (<> ) |
等于 |
!= |
不等于 |
< |
小于 |
> |
大于 |
<= (=< ) |
小于或等于 |
>= (=> ) |
大于或等于 |
1 | // 比较运算符:过滤出数组中name属性小于"Newton"的对象组成的新数组 |
20.5.1.2 逻辑运算符
说明:共3个
逻辑运算符 | O-C 形式 |
c语言形式 | ||
---|---|---|---|---|
与 | AND |
&& |
||
或 | OR |
` | ` | |
非 | NOT |
! |
注意:
谓词字符串
中的运算符不区分大小写
1 | // 逻辑运算符 |
20.5.2 数组运算符
说明:有2个
|数组运算符|说明|
|BETWEEN
|判断是否介于两个值之间|
|IN
|判断数组中是否包含某个值|
1 | // 数组运算符 BETWEEN:使用数组字面量 |
20.6 有 SELF 就足够了
说明:在谓词字符串的
键路径
部分,除了可以使用对象的属性名外,还可以通过SELF
引用自身。
用途:SELF
表示的是响应谓词计算的对象本身,适用于将谓词应用于简单的值(例如纯文本字符串),而非哪些可以通过键路径进行操作的复杂对象。
技巧:可以使用谓词
计算两个数组的交集,其中一个数组作为主语
,另一个在谓词
中,使用IN
运算符。
1 | //------------ SELF :应用于复杂对象 |
20.7 字符串运算符
说明:3个专门针对字符串的运算符
运算符 | 说明 |
---|---|
BEGINSWITH |
前缀是否是某一个字符串 |
ENDSWITH |
后缀是某一个字符串 |
CONTAINS |
是否包含某一个子串 |
运算符修饰符:
修饰符 | 说明 |
---|---|
c |
不区分大小写 |
d |
不区分发音符号 |
cd |
不区分大小写和发音符号 |
建议:处分是需要区分大小写或重音符号的特殊原因,否则请尽力使用
cd
修饰符。
1 | //----------- 字符串运算符 |
20.8 LIKE 运算符
说明:
LIKE
运算符包含2个通配符
通配符 | 说明 |
---|---|
* |
与任意个任意字符匹配 |
? |
与一个任意字符匹配 |
扩展:如果热衷于正则表达式,可以使用
MATCHES
运算符。
技巧:由于正则表达式计算开销比较大,因此可以在使用MATCH
之前先使用其它运算符做初步过滤,从而提高运算速度。
1 | //------------- like 运算符 |