在Objective-C数组中获取特定类型的所有对象的优雅方法

时间:2010-04-23 14:00:57

标签: objective-c arrays reflection

我知道我能做到

for (id obj in array)
{
    if ([obj isKindOfClass:[Elephant class]])
        [elephants addObject:obj];
}

但我觉得必须有更优雅的方式来做到这一点。我看过过滤数组,但无法提出一个好的谓词。想法?

2 个答案:

答案 0 :(得分:3)

谓词类似于

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];
    }];

答案 1 :(得分:0)

您可以创建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]];
}

还有一个加号:可重复使用