iOS 探讨之 NSPredicate构造 之 格式字符串

阐述
提升产品的性能,一方面可以从界面构造上入手,另一方面可以从业务数据处理上进行入手。 
业务数据处理优化中,数据的筛选是很大一部分,这个过程中遇见了”NSPredicate”,感觉这个东西很不错,初步了解并记录一下,毕竟东西有点多。


探讨

1 谓词是什么

Predicate 翻译过来,是谓词的意思。

在百度中,对谓词描述如下: 
谓词,用来描述或判定客体性质、特征或者客体之间关系的词项。
谓词:在计算机语言的环境下,谓词是指条件表达式的求值返回真或假的过程。


在Apple官方文档,对NSPredicate的描述如下:
A definition of logical conditions used to constrain a search either for a fetch or for in-memory filtering.
一种逻辑的定义,这种逻辑用于约束一个搜索条件,这个搜索条件可以用于数据的获取或者是内存数据的筛选.

2 谓词分哪几类
谓词分为两类 Comparision(比较) 和 Compound(混合) 。
官方文档中对种类的描述:
* A comparison predicate compares two expressions using an operator. The expressions are referred to as the left hand side and the right hand side of the predicate (with the operator in the middle). A comparison predicate returns the result of invoking the operator with the results of evaluating the expressions.
* A compound predicate compares the results of evaluating two or more other predicates, or negates another predicate.

大致意思:
比较谓词用操作符来评估比较两个表达式。这两个表达式一个在操作符的左侧,一个在操作符的右侧。比较谓词返回的是内部操作符与相关语句执行的结果。
混合谓词比较评估两个或者多个其他谓词的结果,或否定另一个谓词。


3 怎么创建谓词

创建谓词有三种方式
1 用格式字符串创建
2 用指定函数创建
3 用谓词模板创建

这次我们将主要探讨用格式字符串来创建谓词(NSPredicate)这种方式。


4 谓词字符串解析器
首先我们需要了解一下解析格式字符串的解析器,谓词字符串解析器它是对空格不敏感的,对关键字的大小写不敏感的,并支持嵌套的括号表达式。解析器不执行语义类型检查。
格式字符串支持 printf风格的样式,其中我们使用最多的则是 %@ %K
%@  用于参数替换,目标为对象类型(String,Number, Date等)
%K  用于参数替换,目标为键值

当字符串用 %@形式替换的时候,在格式字符串中它会自动加上双引号(“”),如果你想实现动态属性名,用%K比较合适,因为它不会自动加上双引号(“”)。
举个例子:
NSString *attributeName = @“firstName”;
NSString *attributeValue = @“Adam”;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@“%K like %@“, attributeName, attributeValue];
那么这个格式字符串实际上执行的是  firstName like “Adam” 语句。
用单引号(‘')、双引号(“”)包围的%@, 包围的%K, 或者是包围的$变量名 都会被直接转换为字面的意思。
举个例子:
NSString *attributeName = @“firstName”;
NSString *attributeValue = @“Adam”;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@“%K like "%@“", attributeName, attributeValue];
那么这个格式字符串实际上执行的是  firstName like “%@” 语句。

5 基础运算符
在我们了解完解析器后,我们需要掌握一些基础的运算符
- =, ==
  表达式左侧 是否等于 表达式右侧
- >=, =>
  表达式左侧 是否大于等于 表达式右侧
- <=, =<
  表达式左侧 是否小于等于 表达式右侧
- >
  表达式左侧 是否大于 表达式右侧
- <
  表达式左侧 是否小于 表达式右侧
- BETWEEN
  表达式左侧 是否处于 表达式右侧范围内
  (表达式右侧一般为给定上线和下限的两个值的数组)
  举个例子
  NSPredicate *betweenPredicate = [NSPredicate predicateWithFormat:@“attributeName BETWEEN %@“, @[@1, @10]];
  这个谓词匹配 ( (1 <= attributeName )&&(attributeName <= 10) )

6 条件谓词运算符
- TRUEPREDICATE
  表示此谓词永远返回TRUE
- FALSEPREDICATE
  表示此谓词永远返回FALSE

7 基本逻辑谓词运算符
- AND,  &&
  逻辑与
- OR,  ||
  逻辑或
- NOT,  !
  逻辑非

8 字符比较运算符
- BEGINSWITH
  左侧表达式 是否以 右侧表达式 开头
- CONTAINS
  左侧表达式 是否包含 右侧表达式
- ENDSWITH
  左侧表达式 是否以 右侧表达式 结尾
- LIKE
  左侧的表达式 是否与 右侧表达式 相等
  (?与*这种通配符,在LIKE表达式下可以使用,?表示一个或者是多个字符,*表示0个或者多个字符)
- MATCHES
  左侧的表达式 是否与 右侧表达式 相等
  (MATCHES后 必须跟正则表达式来进行比较)

9 集合运算符
- ANY SOME
  特指集合中的任意一个元素 ANY children.age < 18
- ALL
  特指集合中的所有元素  ALL children.age < 18
- NONE
  特指集合中没有一个元素,NONE children.age < 18,  逻辑上跟 NOT( ANY…)  类似
- IN
  等价于SQL语句中的IN操作符, 左侧表达式必须出现在右侧表达式所表示的集合中。 name IN {‘Ben’,’Melissa’,’Nick’}
- array[index]
  特指该数组的第index个元素
- array[FIRST]
  特指该数组的首个元素
- array[LAST]
  特指该数组的最后一个元素
- array[SIZE]
  特指该数组的大小

10 字面使用

- FALSE, NO
  逻辑假
- TRUE, YES
  逻辑真
- NULL, NIL
  空值
- SELF
  代表将要执行的对象本身
- “text”
  普通字符串
- ’text’
  普通字符串
- 0x
  用于标记十六进制数
- 0o
  用于标记八进制数
- 0b
  用于标记二进制数

参考资料

1 https://baike.baidu.com/item/谓词/5490966?fr=aladdin
2 https://developer.apple.com/documentation/foundation/nspredicate
3 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/AdditionalChapters/Introduction.html#//apple_ref/doc/uid/TP40001789

猜你喜欢

转载自blog.csdn.net/yanglei3kyou/article/details/78400397