CocoaフィルタNSPredicate入門使用

6637 ワード

NSPredicateクラスは初めてで、このクラスは主にデータフィルタリングをします.たとえば、配列は条件に基づいてオブジェクトをフィルタし、オブジェクトにオブジェクトが含まれているかどうかをフィルタし、正規表現をサポートします.役割はsql条件クエリーに等しく、システムクラスであるため、より効率的です.
//===================================================
例1:配列オブジェクト属性に基づいてオブジェクトをフィルタする
@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, retain) NSNumber *age;

Personクラスを定義し、nameとage属性を持つ
   NSMutableArray *array = [NSMutableArray array];
        
        for (int i = 0; i<10; i++) {
            Person *person = [[Person alloc]init];
            [person setAge:[NSNumber numberWithInteger:i]];
            if (i<5) {
                [person setName:[NSString stringWithFormat:@"Jack-%d",i]];
            }else{
                [person setName:[NSString stringWithFormat:@"Tom-%d",i]];
            }
            [array addObject:person];
        }
        
        
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age>5"];
        
        for (Person *person in array) {
            if ([predicate evaluateWithObject:person]) {
                NSLog(@"    ,  :%@",person);
            }
        }
Personオブジェクトを10個作成しarray配列に格納
次に、ageプロパティ>5のPersonオブジェクトをフィルタするpredicateオブジェクトを作成します.
for inで配列を巡回し、evaluateWithObjectはオブジェクトが条件を満たすかどうかを比較し、満足すれば印刷できるように呼び出す.
for inループを実用化しない場合は、配列のフィルタリングで条件を満たす新しい配列を得ることもできます.
NSArray *arr = [array filteredArrayUsingPredicate:predicate];

最後のfor inループの代わりに上記の文で新しい配列arrを取得し,条件age>5を満たすPersonオブジェクトを格納する.
//=======================================================================
Cocoa NSPredicate       ,                
    :  
//       
NSPredicate *predicate;  
predicate = [NSPredicate predicateWithFormat: @"name == 'Herbie'"];  
    BOOL match = [predicate evaluateWithObject: car];  
    NSLog (@"%s", (match) ? "YES" : "NO");  
  
//   cars        
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];  
    NSArray *cars = [garage cars];  
    for (Car *car in [garage cars]) {  
        if ([predicate evaluateWithObject: car]) {  
            NSLog (@"%@", car.name);  
        }  
    }  
  
//         
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];  
    NSArray *results;  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
  
//         
    NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name == $NAME"];  
    NSDictionary *varDict;  
    varDict = [NSDictionary dictionaryWithObjectsAndKeys:  
               @"Herbie", @"NAME", nil];  
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict];  
    NSLog(@"SNORGLE: %@", predicate);  
    match = [predicate evaluateWithObject: car];  
  NSLog (@"%s", (match) ? "YES" : "NO");  
//      $VARIABLE     ,         
  
//        c               
    predicate = [NSPredicate predicateWithFormat:  
                 @"(engine.horsepower > 50) AND (engine.horsepower < 200)"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"oop %@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name < 'Newton'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", [results valueForKey: @"name"]);  
  
//          
    predicate = [NSPredicate predicateWithFormat:  
                 @"engine.horsepower BETWEEN { 50, 200 }"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    NSArray *betweens = [NSArray arrayWithObjects:  
                         [NSNumber numberWithInt: 50], [NSNumber numberWithInt: 200], nil];  
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN %@", betweens];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
    predicateTemplate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN $POWERS"];  
    varDict = [NSDictionary dictionaryWithObjectsAndKeys: betweens, @"POWERS", nil];  
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
  
//IN     
    predicate = [NSPredicate predicateWithFormat: @"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", [results valueForKey: @"name"]);  
    predicate = [NSPredicate predicateWithFormat: @"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", [results valueForKey: @"name"]);  
     
    names = [cars valueForKey: @"name"];  
    predicate = [NSPredicate predicateWithFormat: @"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];  
    results = [names filteredArrayUsingPredicate: predicate];//     SELF     
    NSLog (@"%@", results);  
//BEGINSWITH,ENDSWITH,CONTAINS  
  
//    ,[c],[d],[cd],c        ,d         ,cd          
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'Bad'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'HERB'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH[cd] 'HERB'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
  
//LIKE   (   )  
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '*er*'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '???er*'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);