我有一个包含可能不同类的对象的数组,例如:
NSArray *multiClassArray = @[@"foo", @42, @"bar"];
我想获得一个新数组,其中包含multiClassArray
的所有对象,其类是NSString
的成员。
是否有更优雅的方法而不是循环遍历multiClassArray
的每个项目,检查其类,并将其适当地存储在新数组中?
答案 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。)