標籤:
謂語:NSPredicate
1,概述:
用於設定指定的過濾器的條件,通俗的理解就是設定選擇的條件,再對指定的對象應用這個條件
2,用法:
a,首先設定謂語。
NSPredicate *predicate=[NSPredicate predicateWithFormat:"name==‘Herbie‘"];
它將“name==‘Herbie‘"謂詞字串賦給謂語,如果文字區塊未使用單引號引用,則為鍵路徑,如果被引用則為文字區塊。
b,通過某個對象,計算謂語。
BOOL match=[predicate evaluateWithObject:car](此處是計算YES或NO)
或者
設定謂語和計算按以下:
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"engine.horsepower>150";
match=[predicate evaluateWithObject:car];
3,延伸用法
a,對NSArray使用。
NSArray *results;
results=[cars filteredArrayUsingPredicate:predicate];
b, 對NSMutabArray使用與a用法相似。
4,遞進用法
a,使用格式說明符。
將條件設定剝離到條件運算式之外。
predicate=[NSPredicate predicateWithFormat:@"engine.horsepower> %d",150];
predicate=[NSPredicate predicateWithFormat:@"name==%@",@"Herbie"];這裡如果要使用%@作為等號後面的條件,則應使用@"name==‘%@‘",@"Herbie"
b,將變數名放入字串字典中,類似於環境變數
首先構造臨時謂詞:predicateTemplate=[NSPredicate predicateWithFormat:@"name==$NAME"];
再構造構造一個字典:NSDictionary *varDict=[NSDictionary dictionaryWithObjectAndKeys:
@"Herbie",@"NAME",nil]
再構造新謂詞:predicate=[predicateTemplate predicateWithSubstitutionVariables:varDict];
或者如下:
predicateTemplate=[NSPredicate predicateWithFormat:@engine.horsepower > $POWER"];
NSDictionary *varDict=[NSDictionary dictionaryWithObjectAndKeys:
[NSNumber numberWithInt:150],@"POWER",nil];
predicate=[predicateTemplate predicateWithSubstitutionVariables:varDict];
c,使用運算子
c1,比較和邏輯運算子>,>=,=>,<=,<,<=,=<,!=,<>,(),AND,OR,NOT,&&,||,!
predicate=[NSPredicate predicateWithFormat:@"(engine.horsepower>50) AND (engine.horsepower <200)"];
results=[cars filterdArrayUsingPredicate:predicate];
c2,數組運算子BETWEEN,IN
NSArray *betweens=[NSArray arrayWithObject:
[NSNumberWithInt:50]
[NSNumberWithInt:200],nil];
predicate=[NSPredicate predicateWithFormat:
@"engine.horsepower BETWEEN %@",betweens];
也可以將前面的環境變數的方法運用進來。
c3,將某個字串數組作為謂語來使用(使用SELF)。
比如,我有一個字串數組:{"Herbie","Snugs","Badger","Flap"},要將其作為條件在cars.name中尋找。
NSArray *names=[cars valueForKey:@"name"];
NSPredicate *predicate=[NSPredicate predicateWithFormat:
@"SELF IN {‘Herbie‘,‘Snugs‘,‘Badger‘,‘Flap‘}];
results=[names filteredArrayUsingPredicate:predicate];
謹記這句話:SELF可以引用用於謂詞計算的對像。如下:
NSArray *names1=[NSArray arrayWithObjects:
@"Herbie",@"Badger",@"Judge",@"Elvis",nil];
NSArray *names2=[NSArray arrayWithObjects:
@"Judge",@"Paper Car",@"Badger",@"Finto",nil];
predicate=[NSPredicate predicateWithFormat:@"SELF IN %@",name1];
results=[names2 filteredArrayUsingPredicate:predicate];
c4,字串運算子
BEGINWITH,ENDWITH,CONTAINS,
例如使用"name BEGINSWITH ‘Bad‘"匹配"Badger"
通常還會有修飾符[c]不區分大小寫,[d]不區分發音符號,[cd]既不區分大小寫,也不區分發音符號,如:
"name BEGINSWITH[cd] ‘HERB‘"
c5,LIKE運算子
如謂詞字串:"name LIKE ‘*er*‘","name LIKE ‘???er*‘"
c6,MATCHS運算子
主要是使用Regex,但是計算的開銷很大。
Objective-C日記-之NSPredicate