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

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

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


    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之前可以先执行简单的运算,这样将提高程序的性能。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,069评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,212评论 1 287
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,912评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,424评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,741评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,194评论 1 206
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,553评论 2 307
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,289评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,923评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,251评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,775评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,144评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,698评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,658评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,214评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,159评论 2 258

推荐阅读更多精彩内容