优雅的方式来获得一个Objective-C阵列
问题描述:
特定类型的所有对象,我知道我能做到优雅的方式来获得一个Objective-C阵列
for (id obj in array)
{
if ([obj isKindOfClass:[Elephant class]])
[elephants addObject:obj];
}
,但我觉得必须有这样做的更优雅的方式。我看过滤数组,但不能提出一个好的谓词。思考?
答
谓词会是这样的
Class ec = [Elephant class];
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"class==%@", ec];
NSArray *elephants = [array filteredArrayUsingPredicate:elePred];
或
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", ec];
我发现谓词是相当的,呃..应该说 “重”。我可能会更喜欢你的代码。
如果你只是希望可以丰富您的生活一点点,你可以使用数据块加少许并发...
NSMutableArray *results = [NSMutableArray array];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if([obj isKindOfClass:[Elephant class]])
[results addObject:obj];
}];
答
您可以创建类别NSMutableArray
并添加下一个方法:
- (void)addObject:(id)anObject ifItIsKindOfClass:(Class) classObj {
if ([anObject isKindOfClass:classObj]) {
[self addObject:anObject];
}
}
而简单的写:
for (id obj in array)
{
[elephants addObject:obj ifItIsKindOfClass:[Elephant class]];
}
有一个加号:可重复使用。
我把它放在C函数中。不需要它是数组类的实例成员,甚至不需要静态成员。将它添加到NSMutableArray似乎毫无意义,因为它对其他类型的数组也同样适用。 – 2010-04-23 15:17:36