《Objective-C基础教程》读书笔记16—NSPredicate

Cocoa提供了一个名为NSPredicate的类,它用于指定过滤器的条件。可以创建NSPredicate对象,通过它准确地描述所需的条件,通过谓词筛选每个对象,判断它们是否与条件相匹配。

  1. 创建谓词
    首先需要创建NSPredicate对象,才能将它应用于其他对象。


    《Objective-C基础教程》读书笔记16—NSPredicate_第1张图片
    image.png

    这种谓词字符串看上去像是标准的C语言表达式。它的左侧是键路径name, 随后是一个等于运算符“=”, 右侧是一个用单引号括起来的字符串。如果谓词字符串中的这段文本没有打引号,就会被当做键路径。只有打了引号,它才能被当做字符串的字面量来处理。可以使用单引号也可以使用双引号(只要前后匹配就可以了),通常,还是应该使用单引号,否则必须在字符串中对每一个双引号进行转义。

  2. 计算谓词
    通过以上步骤可以得到一个谓词,接下来通过某个对象来计算它。


    image.png

    image.png

    以上计算方法的原理:若指定对象(以上方法所传参数)的属性值与谓词表达式的条件一致,则返回YES, 否则返回NO.

  3. 数组过滤器
    Cocoa某些集合类官方API包含谓词过滤方法, 比如NSArray。


    image.png

    image.png

    注意:① 以上分别是NSArray和NSMutableArray的一种类别方法,它将循环过滤数组内容,根据谓词计算每个对象的值,并将值为YES的对象累积到被返回的新数组中。②
    将valueForKey: 发送给数组时,键将作用于数组中的每个元素。
    使用谓词确实很方便,但它的运行速度不会比你自己编写全部代码快,因为它无法避免在所有的对象之间使用循环和对每个对象进行某些操作。一般来说,这种循环并不会对OSX上应用的性能产生很大的影响,因为当今的计算机运行速度非常快。尽量编写最简捷的代码。如果遇到了速度问题,可以使用Instruments来测试程序性能,不过iOS程序员应该随时密切关注程序的性能。

  4. 格式说明符
    硬编码并非好办法。(与之对应所理解的软编码:动态可调控)
    可以通过两种方式将不同的内容放入谓词格式字符串中:格式说明符和变量名。
    ① 格式说明符
    可以在%d或者%f格式说明符中使用数字形式的值,可以使用%@插入字符串值,而%@会被当做一个有引号的字符串。


    image.png

    NSPredicate字符串中也可以使用%k来指定键路径。


    image.png

    ② 变量名
    image.png

    可以使用各种对象作为变量的值。记住,可以使用[NSNull null]来设置nil值。
    请注意:不能使用“$变量名”作为键路径,它只能表示值。使用谓词格式字符串时,如果想在程序中通过代码改变键路径,需要使用%k格式说明符。
    谓词机制不进行静类型检查。你也许会在要输入数字的地方不小心插入字符串,这样就会出现运行时错误信息,或者其他不可预知的行为。
  5. 运算符
    5.1 比较和逻辑运算符
    NSPredicate的格式字符串包含大量不同的运算符,可以自己查看文档学习。


    image.png

    谓词字符串语法支持C语言中一些常用的运算符,例如等号,或者不等号,还支持括号表达式、以及逻辑运算符。
    谓词字符串中的运算符不区分大小写,统一使用大写字母。
    不等号既适用于数字值又适用于字符串值。
    5.2 数组运算符

  6. 有SELF就足够了
    谓词不仅能应用于那些可以通过键路径进行操作的复杂对象,也能应用于简单的值。例如,数组或者纯文本的字符串,此时,用SELF代替键。SELF表示的是响应谓词计算的对象。事实上我们可以将谓词中所有的键路径表示成对应的SELF形式。
  7. 字符串运算符
    针对字符串的关系运算符如下
    使用关系运算符可以执行一些有用的操作,例如使用"name BEGINSWITH 'Bad'"匹配Badger, 使用"name ENDSWITH 'vis'"匹配Elvis, 以及使用"name CONTAINS udg"匹配Judge。谓词字符串会将Herbie与"name BEGINSWITH[cd] 'HERB'"相匹配。[cd]忽略对大小写和发音符号的区分。
  8. LIKE运算符
    LIKE运算符,在该运算符中,问号表示与一个字符匹配,星号表示与任意个字符匹配。
    这种操作有时被称为通配符。
    谓词字符串"name LIKE" 'er'"将会与任何含有er的名称相匹配。这等效于CONTAINS。
    谓词字符串"name LIKE '???er*'"将会与Paper Car相匹配,因为其中的er前面有3个字符,er后面有一些字符,但它与Badger不匹配,因为Badger的er前面有4个字符。
    LIKE也接收[cd]修饰符,用于忽略对大小写和发音符号的区分。
    如果你热衷于正则表达式,可以使用MATCHER运算符。赋给它一个正则表达式,谓语将会计算出它的值。
    正则表达式功能非常强大,它是一种指定字符串匹配逻辑的非常紧凑的方式。有时,正则表达式的形式会变得复杂而费解。NSPredicate正则表达式使用ICU语法,可搜索相关知识。虽然正则表达式的功能非常强大,但计算开销非常大。如果在谓词中有某些简单的运算符,例如基本字符串运算和比较运算符,那么在使用MATCHES之前可以先执行简单的运算,这样将提高程序的性能。

你可能感兴趣的:(《Objective-C基础教程》读书笔记16—NSPredicate)