这里有一个简单的例子来说明如何做到这一点:
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSArray *arrayOne = @[@{@"name": @"Alvin"}, @{@"name": @"Brian"}, @{@"name": @"Charlie"}];
BMPPerson *alvin = [[BMPPerson alloc] initWithName:@"Alvin"];
BMPPerson *charlie = [[BMPPerson alloc] initWithName:@"Charlie"];
NSArray *arrayTwo = @[alvin, charlie];
NSArray *values = [arrayTwo valueForKey:@"name"];
NSMutableArray *filteredValues = [NSMutableArray array];
[arrayOne enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSString *name = [obj valueForKey:@"name"];
if ([values containsObject:name]) {
[filteredValues addObject:name];
}
}];
NSLog(@"%@", filteredValues);
}
return 0;
}
在示例中,arrayOne 是 NSArray 的 NSDictionary 对象。每个对象都有一个name 的键。
arrayTwo 中包含的对象是具有name 属性的基本 NSObject 子类。
为了获取arrayTwo 中所有对象的名称属性值,我们使用了键值编码方法-valueForKey:,它在接收器中的每个对象上调用-valueForKey:,并返回一个数组结果。
然后我们创建一个NSMutableArray 来保存来自arrayOne 的过滤结果。
接下来我们使用-enumerateObjectsUsingBlock: 方法枚举arrayOne 中的对象。在这个例子中,我们知道obj 参数是一个NSDictionary,它的键是name。我们可以简单地调用-valueForKey: 并将值存储在我们的局部变量name 中,而不是转换为NSDictionary 并调用-objectForKey:。然后我们检查name 是否在values 数组中,如果是,将其添加到我们的filteredValues。