使用謂詞(NSPredicate)來提高集合遍歷與過濾查找的效率

前言

在開發(fā)中,我們經(jīng)常會遇到一些需要,讓我們從集合中查找某個值,從集合中過濾想要的內(nèi)容等等,因而我們就需要遍歷集合,加條件判斷,然后獲取符合條件的值。而關(guān)于集合的遍歷是所有軟件開發(fā)從業(yè)人員經(jīng)常打交道的一些事情。

把范圍縮小到iOS開發(fā)中,關(guān)于集合地遍歷的方法就有好多種,人們一直在討論和爭辯,想尋找出一種最快最有效的方法,是用for循環(huán),還是block,是用并發(fā)操作,還是順序操作,等等。甚至有人不惜使用大數(shù)據(jù)量來測試各種遍歷方式的效率以及精確度。

然而我認(rèn)為尋找并選擇一種自己認(rèn)為合適的操作是最好的,簡單地幾個數(shù)據(jù)的集合,就用到普通的for循環(huán),基于大數(shù)據(jù)量的遍歷就需要用到并發(fā)操作。

NSPredicate
而我并不會在這里展示如何遍歷集合,而是提示一種在iOS開發(fā)中,用一種類似于SQL語句來過濾集合內(nèi)容的方式從而避免了自己進(jìn)行集合遍歷的方法,就是NSPredicate。蘋果在Cocoa touch框架給我們提供了NSPredicate這個類,封裝了一些讓我們可以直接對集合設(shè)置過濾條件的方法,而至于蘋果是如何在SDK中進(jìn)行數(shù)據(jù)查找地,我們并不需要關(guān)心,因?yàn)槲蚁嘈潘龅囊欢ū任覀兒?。學(xué)過SQL語法的人,使用NSPredicate會十分容易。我會在下面的內(nèi)容中詳細(xì)的講述NSPredicate的語法規(guī)則。

符號表達(dá)式

如<, >, == , !=, 等等這些數(shù)學(xué)符號表達(dá)式,在NSPredicate的format中依然有效

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF > 10"];

"SELF"代表的時集合中的對象本身,此時集合對象是整型數(shù)據(jù),在iOS中的集合可以是nil之外的任何數(shù)據(jù)類型。

范圍表示

IN,BETWEEN等等這種代表范圍區(qū)間的格式字符串,可以形象地稱之為關(guān)鍵字

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"age BETWEEN {1,5}"];

"age"代表了集合中對象的一個實(shí)例屬性,此時集合中的對象是一個個的實(shí)體。

字符串區(qū)間

BEGINSWITHENDSWITH,CONTAINS,顧名思義,我們可以很容易理解他們的過濾條件

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",text];

在格式化語言中,我們?nèi)匀豢梢宰匀绲厥褂谩?@“等符號表示變量。[cd]中的c表示不區(qū)分大小寫,d表示不區(qū)分發(fā)音符號。

通配符

LIKE,這些與SQL語義中的關(guān)鍵字定義十分相像。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'"];

在NSPredicate格式串中,是自動給字符串加上引號的,所以我們自定義的字符串必須加上引號(單/雙)

正則匹配

MATCHES,諸如其他的查找語言,都是需要匹配正則表達(dá)式的

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name MATCHES 'Z.+e$'"];

組合查詢

AND,在設(shè)置過濾條件時,可能單一條件并不能滿足我們的需要,所以我們就需要設(shè)置組合條件

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'" AND age > 10];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容