前言
在項目開發(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、2徙赢、
后續(xù)有什么問題或者建議字柠,請給我留言