《Objective-C基礎(chǔ)教程》讀書筆記16—NSPredicate

Cocoa提供了一個(gè)名為NSPredicate的類挡逼,它用于指定過濾器的條件从祝⌒铮可以創(chuàng)建NSPredicate對(duì)象垂谢,通過它準(zhǔn)確地描述所需的條件,通過謂詞篩選每個(gè)對(duì)象疮茄,判斷它們是否與條件相匹配滥朱。

  1. 創(chuàng)建謂詞
    首先需要?jiǎng)?chuàng)建NSPredicate對(duì)象,才能將它應(yīng)用于其他對(duì)象力试。


    image.png

    這種謂詞字符串看上去像是標(biāo)準(zhǔn)的C語言表達(dá)式徙邻。它的左側(cè)是鍵路徑name, 隨后是一個(gè)等于運(yùn)算符“=”, 右側(cè)是一個(gè)用單引號(hào)括起來的字符串。如果謂詞字符串中的這段文本沒有打引號(hào)畸裳,就會(huì)被當(dāng)做鍵路徑缰犁。只有打了引號(hào),它才能被當(dāng)做字符串的字面量來處理∷荩可以使用單引號(hào)也可以使用雙引號(hào)(只要前后匹配就可以了)颇象,通常,還是應(yīng)該使用單引號(hào)并徘,否則必須在字符串中對(duì)每一個(gè)雙引號(hào)進(jìn)行轉(zhuǎn)義遣钳。

  2. 計(jì)算謂詞
    通過以上步驟可以得到一個(gè)謂詞,接下來通過某個(gè)對(duì)象來計(jì)算它麦乞。


    image.png

    image.png

    以上計(jì)算方法的原理:若指定對(duì)象(以上方法所傳參數(shù))的屬性值與謂詞表達(dá)式的條件一致蕴茴,則返回YES, 否則返回NO.

  3. 數(shù)組過濾器
    Cocoa某些集合類官方API包含謂詞過濾方法, 比如NSArray。


    image.png

    image.png

    注意:① 以上分別是NSArray和NSMutableArray的一種類別方法姐直,它將循環(huán)過濾數(shù)組內(nèi)容荐开,根據(jù)謂詞計(jì)算每個(gè)對(duì)象的值,并將值為YES的對(duì)象累積到被返回的新數(shù)組中简肴。②
    將valueForKey: 發(fā)送給數(shù)組時(shí)晃听,鍵將作用于數(shù)組中的每個(gè)元素。
    使用謂詞確實(shí)很方便砰识,但它的運(yùn)行速度不會(huì)比你自己編寫全部代碼快能扒,因?yàn)樗鼰o法避免在所有的對(duì)象之間使用循環(huán)和對(duì)每個(gè)對(duì)象進(jìn)行某些操作。一般來說辫狼,這種循環(huán)并不會(huì)對(duì)OSX上應(yīng)用的性能產(chǎn)生很大的影響初斑,因?yàn)楫?dāng)今的計(jì)算機(jī)運(yùn)行速度非常快膨处。盡量編寫最簡(jiǎn)捷的代碼见秤。如果遇到了速度問題,可以使用Instruments來測(cè)試程序性能真椿,不過iOS程序員應(yīng)該隨時(shí)密切關(guān)注程序的性能鹃答。

  4. 格式說明符
    硬編碼并非好辦法。(與之對(duì)應(yīng)所理解的軟編碼:動(dòng)態(tài)可調(diào)控)
    可以通過兩種方式將不同的內(nèi)容放入謂詞格式字符串中:格式說明符和變量名突硝。
    ① 格式說明符
    可以在%d或者%f格式說明符中使用數(shù)字形式的值测摔,可以使用%@插入字符串值,而%@會(huì)被當(dāng)做一個(gè)有引號(hào)的字符串解恰。


    image.png

    NSPredicate字符串中也可以使用%k來指定鍵路徑锋八。


    image.png

    ② 變量名
    image.png

    可以使用各種對(duì)象作為變量的值。記住护盈,可以使用[NSNull null]來設(shè)置nil值挟纱。
    請(qǐng)注意:不能使用“$變量名”作為鍵路徑,它只能表示值腐宋。使用謂詞格式字符串時(shí)紊服,如果想在程序中通過代碼改變鍵路徑檀轨,需要使用%k格式說明符。
    謂詞機(jī)制不進(jìn)行靜類型檢查围苫。你也許會(huì)在要輸入數(shù)字的地方不小心插入字符串,這樣就會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤信息撤师,或者其他不可預(yù)知的行為剂府。
  5. 運(yùn)算符
    5.1 比較和邏輯運(yùn)算符
    NSPredicate的格式字符串包含大量不同的運(yùn)算符,可以自己查看文檔學(xué)習(xí)剃盾。


    image.png

    謂詞字符串語法支持C語言中一些常用的運(yùn)算符腺占,例如等號(hào),或者不等號(hào)痒谴,還支持括號(hào)表達(dá)式衰伯、以及邏輯運(yùn)算符。
    謂詞字符串中的運(yùn)算符不區(qū)分大小寫积蔚,統(tǒng)一使用大寫字母意鲸。
    不等號(hào)既適用于數(shù)字值又適用于字符串值。
    5.2 數(shù)組運(yùn)算符

  6. 有SELF就足夠了
    謂詞不僅能應(yīng)用于那些可以通過鍵路徑進(jìn)行操作的復(fù)雜對(duì)象尽爆,也能應(yīng)用于簡(jiǎn)單的值怎顾。例如,數(shù)組或者純文本的字符串漱贱,此時(shí)槐雾,用SELF代替鍵。SELF表示的是響應(yīng)謂詞計(jì)算的對(duì)象幅狮。事實(shí)上我們可以將謂詞中所有的鍵路徑表示成對(duì)應(yīng)的SELF形式募强。
  7. 字符串運(yùn)算符
    針對(duì)字符串的關(guān)系運(yùn)算符如下
    使用關(guān)系運(yùn)算符可以執(zhí)行一些有用的操作,例如使用"name BEGINSWITH 'Bad'"匹配Badger, 使用"name ENDSWITH 'vis'"匹配Elvis, 以及使用"name CONTAINS udg"匹配Judge崇摄。謂詞字符串會(huì)將Herbie與"name BEGINSWITH[cd] 'HERB'"相匹配擎值。[cd]忽略對(duì)大小寫和發(fā)音符號(hào)的區(qū)分。
  8. LIKE運(yùn)算符
    LIKE運(yùn)算符逐抑,在該運(yùn)算符中幅恋,問號(hào)表示與一個(gè)字符匹配,星號(hào)表示與任意個(gè)字符匹配泵肄。
    這種操作有時(shí)被稱為通配符捆交。
    謂詞字符串"name LIKE" 'er'"將會(huì)與任何含有er的名稱相匹配。這等效于CONTAINS腐巢。
    謂詞字符串"name LIKE '???er*'"將會(huì)與Paper Car相匹配品追,因?yàn)槠渲械膃r前面有3個(gè)字符,er后面有一些字符冯丙,但它與Badger不匹配肉瓦,因?yàn)锽adger的er前面有4個(gè)字符遭京。
    LIKE也接收[cd]修飾符,用于忽略對(duì)大小寫和發(fā)音符號(hào)的區(qū)分泞莉。
    如果你熱衷于正則表達(dá)式哪雕,可以使用MATCHER運(yùn)算符。賦給它一個(gè)正則表達(dá)式鲫趁,謂語將會(huì)計(jì)算出它的值斯嚎。
    正則表達(dá)式功能非常強(qiáng)大,它是一種指定字符串匹配邏輯的非常緊湊的方式挨厚。有時(shí)堡僻,正則表達(dá)式的形式會(huì)變得復(fù)雜而費(fèi)解。NSPredicate正則表達(dá)式使用ICU語法疫剃,可搜索相關(guān)知識(shí)钉疫。雖然正則表達(dá)式的功能非常強(qiáng)大,但計(jì)算開銷非常大巢价。如果在謂詞中有某些簡(jiǎn)單的運(yùn)算符牲阁,例如基本字符串運(yùn)算和比較運(yùn)算符,那么在使用MATCHES之前可以先執(zhí)行簡(jiǎn)單的運(yùn)算壤躲,這樣將提高程序的性能咨油。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柒爵,隨后出現(xiàn)的幾起案子役电,更是在濱河造成了極大的恐慌,老刑警劉巖棉胀,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件法瑟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡唁奢,警方通過查閱死者的電腦和手機(jī)霎挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻掸,“玉大人酥夭,你說我怎么就攤上這事〖狗埽” “怎么了熬北?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诚隙。 經(jīng)常有香客問我讶隐,道長,這世上最難降的妖魔是什么久又? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任巫延,我火速辦了婚禮效五,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炉峰。我一直安慰自己畏妖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布疼阔。 她就那樣靜靜地躺著戒劫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竿开。 梳的紋絲不亂的頭發(fā)上谱仪,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天玻熙,我揣著相機(jī)與錄音否彩,去河邊找鬼。 笑死列荔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枚尼。 我是一名探鬼主播贴浙,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼署恍!你這毒婦竟也來了崎溃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤盯质,失蹤者是張志新(化名)和其女友劉穎袁串,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼巷,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囱修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了王悍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破镰。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖压储,靈堂內(nèi)的尸體忽然破棺而出鲜漩,到底是詐尸還是另有隱情,我是刑警寧澤集惋,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布宇整,位于F島的核電站,受9級(jí)特大地震影響芋膘,放射性物質(zhì)發(fā)生泄漏鳞青。R本人自食惡果不足惜霸饲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臂拓。 院中可真熱鬧厚脉,春花似錦、人聲如沸胶惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵滞。三九已至中捆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坊饶,已是汗流浹背泄伪。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匿级,地道東北人蟋滴。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像痘绎,于是被迫代替她去往敵國和親津函。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一孤页、Java 簡(jiǎn)介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,160評(píng)論 1 44
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)尔苦,也就是一...
    悟名先生閱讀 4,131評(píng)論 0 13
  • 簡(jiǎn)介 NSPredicate是基礎(chǔ)庫中用來過濾獲取數(shù)據(jù)的類,類似于SQL中的where語句行施,但它提供了更為自然且高...
    JABread閱讀 5,978評(píng)論 1 6
  • 首先允坚,我們需要知道何謂謂詞,讓我們看看官方的解釋: The NSPredicate class is used t...
    jeckHao閱讀 1,138評(píng)論 1 5
  • 沒有反思的人生不值得過 每天努力一點(diǎn)點(diǎn)悲龟,為孩子樹榜樣 好習(xí)慣養(yǎng)成 1,早起床5/7 2. 最晚11.00睡√ 3...
    春暖花開劉寧閱讀 79評(píng)論 0 0