获取Objective-C中指定类的NSArray的所有对象

时间:2013-12-18 20:17:43

标签: objective-c nsarray

我有一个包含可能不同类的对象的数组,例如:

NSArray *multiClassArray = @[@"foo", @42, @"bar"];

我想获得一个新数组,其中包含multiClassArray的所有对象,其类是NSString的成员。

是否有更优雅的方法而不是循环遍历multiClassArray的每个项目,检查其类,并将其适当地存储在新数组中?

2 个答案:

答案 0 :(得分:5)

这可以使用NSArray的实例方法完成:

  • - indexesOfObjectsPassingTest:
  • - objectsAtIndexes:

以下代码是如何创建包含原始数组的所有字符串对象的数组的示例。

NSArray *multiClassArray = @[@"foo", @42, @"bar"];

NSIndexSet *idxSetOfStrings = [multiClassArray indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return [obj isKindOfClass:[NSString class]];
}];

NSArray *arrayOfStrings = [multiClassArray objectsAtIndexes:idxSetOfStrings];

答案 1 :(得分:2)

替代解决方案

NSArray *multiClassArray = @[@"foo", @42, @"bar"];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSString class]];
NSArray* arrayOfStrings = [multiClassArray filteredArrayUsingPredicate:predicate];

(是的,这样的谓词确实有效。比较https://stackoverflow.com/a/18378811/1187415。)