Cocoa提供了一個名為
NSPredicate
的類,它用于指定過濾器的條件。可以創(chuàng)建NSPredicate
對象,通過它準(zhǔn)確的描述所需的條件,通過謂詞篩選每個對象,判斷它們是否與條件相匹配。Cocoa用NSPredicate
描述查詢的方式,原理類似于在數(shù)據(jù)庫中進行查詢,可以在數(shù)據(jù)庫風(fēng)格的API中使用NSPredicate
類,比如Core Data
和Spotlight
。
代碼示例:
兩個對象類:Student和Teacher
//
// Student.h
// 謂詞
//
// Created by on 15/3/16.
// Copyright (c) 2015年 apple. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic, retain) NSString *stuName;
@property (nonatomic, assign) NSInteger stuAge;
- (id)initWithName:(NSString *)name andAge:(NSInteger)age;
@end
//
// Student.m
// 謂詞
//
// Created by on 15/3/16.
// Copyright (c) 2015年 apple. All rights reserved.
//
#import "Student.h"
@implementation Student
- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
if (self = [super init]) {
_stuName = name;
_stuAge = age;
}
return self;
}
@end
//
// Teacher.h
// 謂詞
//
// Created by on 15/3/16.
// Copyright (c) 2015年 apple. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Student;
@interface Teacher : NSObject
@property (nonatomic, strong) Student *student;
@property (nonatomic, retain) NSString *teaName;
@property (nonatomic, assign) NSInteger teaAge;
- (id)initWithName:(NSString *)name andAge:(NSInteger)age;
@end
//
// Teacher.m
// 謂詞
//
// Created by wujiafeng on 15/3/16.
// Copyright (c) 2015年 apple. All rights reserved.
//
#import "Teacher.h"
@implementation Teacher
- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
if (self = [super init]) {
_teaName = name;
_teaAge = age;
}
return self;
}
@end
測試:
//
// main.m
// 謂詞
//
// Created by wujiafeng on 15/3/16.
// Copyright (c) 2015年 apple. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [[Student alloc] initWithName:@"Jack" andAge:12];
Teacher *teacher = [[Teacher alloc] initWithName:@"Tom" andAge:20];
// 設(shè)置teacher中的student對象
teacher.student = stu;
// 創(chuàng)建謂詞
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"student._stuName == 'Jack'"];
// 通知接收對象(即謂詞)根據(jù)指定的對象計算自身的值
BOOL match = [predicate evaluateWithObject:teacher];
NSLog(@"%s", (match) ? "YES" : "NO");
NSMutableArray *stuArray = [NSMutableArray arrayWithCapacity:10];
for (int i = 0; i < 10; i++) {
Student *studentTemp = [[Student alloc] initWithName:[NSString stringWithFormat:@"jack%d", i] andAge:20 + i];
[stuArray addObject:studentTemp];
}
NSPredicate *pre = [NSPredicate predicateWithFormat:@"_stuAge > 25"];
// 迭代出年齡大于25歲的學(xué)生信息
for (Student *temp in stuArray) {
if ([pre evaluateWithObject:temp]) {
NSLog(@"姓名:%@,年齡:%ld", temp.stuName, temp.stuAge);
}
}
// 調(diào)用數(shù)組過濾器實現(xiàn)過濾
// 此方法會返回一個NSArray數(shù)組
NSArray *stus = [stuArray filteredArrayUsingPredicate:pre];
// 此方法是直接從NSMutableArray中過濾掉不滿足條件的項
[stuArray filterUsingPredicate:pre];
// KVC的運用
NSArray *stuNamesForMutable = [stuArray valueForKey:@"stuName"];
NSLog(@"%@", stuNamesForMutable);
NSLog(@"=======調(diào)用數(shù)組方法處理=======");
for (Student *temp in stus) {
NSLog(@"姓名:%@,年齡:%ld", temp.stuName, temp.stuAge);
}
// KVC的運用
NSArray *arryForStuName = [stus valueForKey:@"stuName"];
NSLog(@"%@", arryForStuName);
pre = [NSPredicate predicateWithFormat:@"_stuName == %@", @"Tom"];
// 這里的%K指的是鍵路徑
pre = [NSPredicate predicateWithFormat:@"%K == %@", @"_stuName", @"Tom"];
// 另一種方式是將變量名放入字符串中,類似于環(huán)境變量
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"_stuName == $NAME"];
// 這里鍵是變量名(不包括美元符號),這里用字符串Jack作為鍵“NAME”的值
NSDictionary *varDic = [NSDictionary dictionaryWithObjectsAndKeys:@"Jack", @"NAME", nil];
pre = [predicateTemplate predicateWithSubstitutionVariables:varDic];
BOOL match1 = [pre evaluateWithObject:stu];
NSLog(@"%s", (match1) ? "YES" : "NO");
}
return 0;
}
輸出結(jié)果如下:
2015-03-16 18:30:23.938 謂詞[581:15147] YES
2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack6,年齡:26
2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack7,年齡:27
2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack8,年齡:28
2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack9,年齡:29
2015-03-16 18:30:23.939 謂詞[581:15147] (
jack6,
jack7,
jack8,
jack9
)
2015-03-16 18:30:23.939 謂詞[581:15147] =======調(diào)用數(shù)組方法處理=======
2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack6,年齡:26
2015-03-16 18:30:23.940 謂詞[581:15147] 姓名:jack7,年齡:27
2015-03-16 18:30:23.940 謂詞[581:15147] 姓名:jack8,年齡:28
2015-03-16 18:30:23.940 謂詞[581:15147] 姓名:jack9,年齡:29
2015-03-16 18:30:23.940 謂詞[581:15147] (
jack6,
jack7,
jack8,
jack9
)
2015-03-16 18:30:23.940 謂詞[581:15147] YES