1. 程式人生 > >Object-c學習筆記十八-----NSPredicate

Object-c學習筆記十八-----NSPredicate

Cocoa提供了一個類NSPredicate類,該類主要用於指定過濾器的條件,該物件可以準確的描述所需條件,對每個物件通過謂詞進行篩選,判斷是否與條件相匹配。謂詞表示計算真值或假值的函式。

    NSPredicate *predicate;

    predicate=[NSPredicatepredicateWithFormat:@"name=='Herbie'"];//predicateWithFormat建立一個謂詞,name作為鍵路徑

BOOL match=[predicateevaluateWithObject:car];//car作為接收物件,evaluateWithObject返回一個

bool值。

    NSLog(@"%s",(match)?"YES":"NO");

  predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > 150"];

    NSArray *cars = [garage cars];

    for (Car *car in [garage cars]) {

        if ([predicate evaluateWithObject: car]) {

            NSLog (@"%@", car.name);

        }

    }

遍歷cars判斷是否是真,然後輸出。

  predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > 150"];

    NSArray *results;

    results = [carsfilteredArrayUsingPredicate: predicate];//它將迴圈過濾陣列內容,根據謂詞計算每個物件的值,並將值為YES的物件累計到將被返回的新陣列中。

    NSLog (@"%@", results);

filteredArrayUsingPredicate這個方法可以得到我們所需要的值。加上

   NSArray *names;

    names=[results valueForKey:@"name"];

    NSLog (@"%@", names);

就和上面的值一樣。

    NSMutableArray *carsCopy = [carsmutableCopy];

    [carsCopyfilterUsingPredicate: predicate];//filterUsingPredicateNSMutableArray構成新陣列。

    NSLog (@"%@", carsCopy);

    predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > %d", 50];

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    NSPredicate *predicateTemplate;

    NSDictionary *varDict;

    predicateTemplate = [NSPredicatepredicateWithFormat: @"engine.horsepower > $POWER"];//建立一個鍵/值字典來儲存,這裡$符號用於變數

    varDict = [NSDictionarydictionaryWithObjectsAndKeys:

               [NSNumbernumberWithInt: 150],@"POWER", nil];//@後面引數名

    predicate = [predicateTemplatepredicateWithSubstitutionVariables: varDict];

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);


  predicate = [NSPredicatepredicateWithFormat:

@"(engine.horsepower > 50) AND (engine.horsepower < 200)"];//可以運用運算子

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"oop %@", results);

    predicate = [NSPredicatepredicateWithFormat:

@"engine.horsepower BETWEEN { 50, 200 }"];//這裡可以運用between關鍵字。和上面效果一樣

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    NSArray *betweens = [NSArray arrayWithObjects:

                         [NSNumbernumberWithInt: 50], [NSNumbernumberWithInt: 200],nil];

    predicate = [NSPredicatepredicateWithFormat: @"engine.horsepower BETWEEN %@", betweens];

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    predicateTemplate = [NSPredicatepredicateWithFormat:@"engine.horsepower BETWEEN $POWERS"];

    varDict = [NSDictionarydictionaryWithObjectsAndKeys: betweens, @"POWERS", nil];

    predicate = [predicateTemplatepredicateWithSubstitutionVariables: varDict];//用變數

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    predicate = [NSPredicatepredicateWithFormat:@"name < 'Newton'"];//不等號不僅可以用於數字,也可以用於字串值。

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", [results valueForKey: @"name"]);

    predicate = [NSPredicatepredicateWithFormat:@"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//包含在其中用IN

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", [results valueForKey: @"name"]);

    predicate = [NSPredicatepredicateWithFormat:@"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//self關鍵字

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", [results valueForKey: @"name"]);

    names = [cars valueForKey: @"name"];

    predicate = [NSPredicatepredicateWithFormat:@"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//self關鍵字

    results = [namesfilteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    predicate = [NSPredicatepredicateWithFormat:@"name BEGINSWITH 'Bad'"];//字串運算子BEGINSWITH,ENDSWITH,CONTAINS[c][d][cd]

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

BEGINSWITH:檢查某個字串是否以另一個字串開頭。

ENDSWITH:檢查某個字串是否以另一個字串結尾。

CONTAINS:檢查某個字串是否以另一個字串內部。

[c]不區分大小寫[d]不區分發音符號即沒有重音符號[cd]既不區分大小寫,又不區分發音符號。

    predicate = [NSPredicatepredicateWithFormat:@"name LIKE[cd] '*er*'"];//*代表萬用字元Like還接受[cd].

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

    predicate = [NSPredicatepredicateWithFormat:@"name LIKE[cd] '???er*'"];//?只匹配一個字元並且還可以接受[cd].

    results = [cars filteredArrayUsingPredicate: predicate];

    NSLog (@"%@", results);

還可以使用MATCHES運算子。賦給該運算子一個正則表示式。