iOS NSPredicate(謂詞)語法

前言

在項目開發(fā)中遇見本地化搜索不是很高口蝠,當有本地化搜索的需求時候?qū)SPredicate的語法都去網(wǎng)上搜索,然而蘋果官方也沒有專門介紹語法,借這次機會總結和寫下謂詞的語法俐筋,方便以后開發(fā)查看

NSPredicate的語法

比較運算符

1静秆、=粮揉,==:判斷兩個表達式是否相等,在謂詞中=和==是相同的意思都是判斷诡宗,而沒有賦值這一說
2滔蝉、>=,=>:判斷左邊表達式的值是否大于或等于右邊表達式的值
3塔沃、>:判斷左邊表達式的值是否大于右邊表達式的值
4蝠引、<:判斷左邊表達式的值是否小于右邊表達式的值
5、!=蛀柴、<>:判斷兩個表達式是否不相等
6螃概、BETWEEN:BETWEEN表達式必須滿足表達式 BETWEEN {下限,上限}的格式鸽疾,要求該表達式必須大于或等于下限吊洼,并小于或等于上限

例:

//數(shù)據(jù)源
let word = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o"]
//相等判斷
let equalPredicate:NSPredicate = NSPredicate.init(format: "SELF == 'b'")
print("word[1] is = b -> \(equalPredicate.evaluate(with: word[1]))")
//之間判斷
let betweenPredicate:NSPredicate = NSPredicate.init(format: "SELF BETWEEN {'d','m'}")
 for item in word {
      print("word item is between {'d','m'} -> \(betweenPredicate.evaluate(with: item))")
}
word[1] is = b -> true
word item is between {'d','m'} -> false
word item is between {'d','m'} -> false
word item is between {'d','m'} -> false
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> true
word item is between {'d','m'} -> false
word item is between {'d','m'} -> false

邏輯運算符

1、BEGINSWITH:檢查某個字符串是否以指定的字符串開頭(如判斷字符串 是否以a開頭:BEGINSWITH 'a')
2制肮、ENDSWITH:檢查某個字符串是否以指定的字符串結尾
3冒窍、CONTAINS:檢查某個字符串是否包含指定的字符串
4、LIKE:檢查某個字符串是否匹配指定的字符串模板豺鼻。其之后可以跟?代表一個字符和代表任意多個字符兩個通配符综液。比如"name LIKE 'ac'",這表示name的值中包含ac則返回YES儒飒;"name LIKE '?ac'"谬莹,表示name的第2、3個字符為ac時返回YES桩了。
5附帽、MATCHES:檢查某個字符串是否匹配指定的正則表達式。雖然正則表達式的執(zhí)行效率是最低的井誉,但其功能是最強大的蕉扮,也是我們最常用的。

注:字符串比較都是區(qū)分大小寫和重音符號的颗圣。如:café和cafe是不一樣的慢显,Cafe和cafe也是不一樣的爪模。如果希望字符串比較運算不區(qū)分大小寫和重音符號,請在這些運算符后使用[c]荚藻,[d]選項屋灌。其中[c]是不區(qū)分大小寫,[d]是不區(qū)分重音符號应狱,其寫在字符串比較運算符之后共郭,比如:name LIKE[cd] 'cafe',那么不論name是cafe疾呻、Cafe還是café上面的表達式都會返回YES除嘹。

例:最常見的就是正則匹配了

//判斷是不是郵箱
let emailRegular = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let emailpredicate = NSPredicate(format:"SELF MATCHES %@", emailRegular)
print("www.llllll.com is = email -> \(emailpredicate.evaluate(with: "www.llllll.com"))")
print("www@llllll.com is = email -> \(emailpredicate.evaluate(with: "www@llllll.com"))")
www.llllll.com is = email -> false
www@llllll.com is = email -> true

集合運算符

1、ANY岸蜗、SOME:集合中任意一個元素滿足條件尉咕,就返回YES。
2璃岳、ALL:集合中所有元素都滿足條件年缎,才返回YES。
3铃慷、NONE:集合中沒有任何元素滿足條件就返回YES单芜。如:NONE person.age < 18,表示person集合中所有元素的age>=18時犁柜,才返回YES洲鸠。
4、IN:等價于SQL語句中的IN運算符馋缅,只有當左邊表達式或值出現(xiàn)在右邊的集合中才會返回YES扒腕。

例:

//數(shù)據(jù)源
let word = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o"]
//集合判斷
let equalPredicate:NSPredicate = NSPredicate.init(format: "NONE SELF > 'p'")
print("word 所有元素都不是大于p -> \(equalPredicate.evaluate(with: word))")
word 所有元素都不是大于p -> true

直接量值

在謂詞表達式中可以使用如下直接量
1、FALSE萤悴、NO:代表邏輯假
2瘾腰、TRUE、YES:代表邏輯真
3稚疹、NULL、NIL:代表空值
4祭务、SELF:代表正在被判斷的對象自身
5内狗、"string"或'string':代表字符串
6、數(shù)組:和c中的寫法相同义锥,如:{'one', 'two', 'three'}柳沙。
7、數(shù)值:包括證書拌倍、小數(shù)和科學計數(shù)法表示的形式
8赂鲤、十六進制數(shù):0x開頭的數(shù)字
9噪径、八進制:0o開頭的數(shù)字
10、二進制:0b開頭的數(shù)字

保留值

下列單詞都是保留字(不論大小寫)

AND数初、OR找爱、IN、NOT泡孩、ALL车摄、ANY、SOME仑鸥、NONE吮播、LIKE、CASEINSENSITIVE眼俊、CI意狠、MATCHES、CONTAINS疮胖、BEGINSWITH环戈、ENDSWITH、BETWEEN获列、NULL谷市、NIL、SELF击孩、TRUE迫悠、YES、FALSE巩梢、NO创泄、FIRST、LAST括蝠、SIZE鞠抑、ANYKEY、SUBQUERY忌警、CAST搁拙、TRUEPREDICATE、FALSEPREDICATE

注:雖然大小寫都可以法绵,但是更推薦使用大寫來表示這些保留字箕速,也是上面介紹到的語法,沒介紹到的自己理解吧朋譬,或者給我留言

在謂詞中使用占位符參數(shù)

%K:用于動態(tài)傳入屬性名
%@:用于動態(tài)設置屬性值

例:最后來一個綜合的本地搜索吧盐茎,對自定義對象進行篩選

//自定義對象
@interface YContactObject : NSObject
/**
 *  聯(lián)系人的姓名對象
 */
@property (nonatomic, strong)YContactNameObject * nameObject;
@end

//姓名對象
@interface YContactNameObject : NSObject
/**
 *  姓名
 */
@property (nonatomic, copy)NSString * name;
/**
 *  昵稱
 */
@property (nonatomic, copy) NSString * nickName;
/**
 *  名字
 */
@property (nonatomic, copy) NSString * givenName;

-(NSString *)getName
{
    //除nil處理
    self.middleName = (self.middleName) ? self.middleName : @"";
    self.givenName = (self.givenName) ? self.givenName : @"";
    self.familyName = (self.familyName) ? self.familyName : @"";
    
    self.name = [[self.familyName stringByAppendingString:self.middleName] stringByAppendingString:self.givenName];
    
    return self.name;
}

@end
//通訊錄數(shù)組
self.sourceContactObjects:[YContactObject] = [**********]
self.contactObjects:[YContactObject] = []
//姓名過濾謂詞
let predicateString:String = String.init(format: "(SELF.nameObject.getName CONTAINS '%@') OR ((SELF.phoneObject != NIL) AND (SELF.getFirstPhone CONTAINS '%@'))", searchText,searchText)
let filterPredicate:NSPredicate = NSPredicate.init(format: predicateString)
self.contactObjects = (sourceContactObjects as NSArray).filtered(using: filterPredicate) as! [YContactObject]

運行結果

1、
Simulator Screen Shot 2017年9月11日 下午5.17.43.png

2徙赢、
Simulator Screen Shot 2017年9月11日 下午5.17.50.png

后續(xù)有什么問題或者建議字柠,請給我留言

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末探越,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窑业,更是在濱河造成了極大的恐慌钦幔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件数冬,死亡現(xiàn)場離奇詭異节槐,居然都是意外死亡,警方通過查閱死者的電腦和手機拐纱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門铜异,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秸架,你說我怎么就攤上這事揍庄。” “怎么了东抹?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵蚂子,是天一觀的道長。 經(jīng)常有香客問我缭黔,道長食茎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任馏谨,我火速辦了婚禮别渔,結果婚禮上,老公的妹妹穿的比我還像新娘惧互。我一直安慰自己哎媚,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布喊儡。 她就那樣靜靜地躺著拨与,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艾猜。 梳的紋絲不亂的頭發(fā)上买喧,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音匆赃,去河邊找鬼淤毛。 笑死,一個胖子當著我的面吹牛炸庞,可吹牛的內(nèi)容都是我干的钱床。 我是一名探鬼主播荚斯,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼埠居,長吁一口氣:“原來是場噩夢啊……” “哼查牌!你這毒婦竟也來了?” 一聲冷哼從身側響起滥壕,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纸颜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绎橘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胁孙,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年称鳞,在試婚紗的時候發(fā)現(xiàn)自己被綠了涮较。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡冈止,死狀恐怖狂票,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熙暴,我是刑警寧澤闺属,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站周霉,受9級特大地震影響掂器,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俱箱,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一国瓮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸聋涨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽响禽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肪康,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工撩穿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磷支,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓食寡,卻偏偏與公主長得像雾狈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抵皱,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 轉(zhuǎn)載自: http://www.cocoachina.com/ios/20160111/14926.html 首先...
    趙yx閱讀 563評論 0 0
  • 初讀《生死場》善榛,被蕭紅這句話震驚到辩蛋。原來窮人里的易于暴怒,是因著苦難的原因移盆。 柴欄外是墨沉沉的靜甜的悼院,微風不敢驚動...
    大若木木閱讀 1,633評論 0 3
  • 今天讀了一篇文章,講到了關于孩子學習成績和物質(zhì)獎勵≈溲現(xiàn)在許多家長為了讓孩子考好或有個學習的動力据途,就對孩子說:“你...
    Subyyy閱讀 711評論 0 0
  • “葬禮是怎么回事?”“人死了會變成什么呢叙甸?”三個孩子因為好奇颖医,也因為各自被某些莫名恐慌所困擾,他們決定去探個究竟裆蒸。...
    淡彩淺綠閱讀 602評論 0 0