如何使用indexOfObject之类的东西获取NSArray的索引?

时间:2011-07-10 22:36:03

标签: iphone objective-c cocoa-touch

我可以使用[NSArray indexOfObject:NSString]来获取我搜索1项的索引。但是我可以使用或做什么来从我的搜索中获取一系列返回的索引?

感谢

2 个答案:

答案 0 :(得分:6)

要获得多个索引,您可以使用indexesOfObjectsPassingTest:

// a single element to search for
id target;
// multiple elements to search for
NSArray *targets;
...
// every index of the repeating element 'target'
NSIndexSet *targetIndices = [array indexesOfObjectsPassingTest:^ BOOL (id obj, NSUInteger idx, BOOL *stop) {
        return [obj isEqual:target];
    }];

// every index of every element of 'targets'
NSIndexSet *targetsIndices = [array indexesOfObjectsPassingTest:^ BOOL (id obj, NSUInteger idx, BOOL *stop) {
        return [targets containsObject:obj];
    }];

在iOS 4中添加了对块的支持。如果您需要支持早期版本的iOS,则indexesOfObjectsPassingTest:不是一个选项。相反,您可以使用indexOfObject:inRange:来推广自己的方法:

@interface NSArray (indexesOfObject)
-(NSIndexSet *)indexesOfObject:(id)target;
@end

@implementation NSArray (indexesOfObject)
-(NSIndexSet *)indexesOfObject:(id)target {
    NSRange range = NSMakeRange(0, [self count]);
    NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];
    NSUInteger idx;
    while (range.length && NSNotFound != (idx = [self indexOfObject:target inRange:range])) {
        [indexes addIndex: idx];
        range.length -= idx + 1 - range.location;
        range.location = idx + 1;
    }
    return [indexes autorelease];
}
@end

答案 1 :(得分:1)

如果您无法访问indexOfObjectsPassingTest,就像@outis建议的那样,您可以使用indexOfObject:inRange:并循环显示结果,更新范围以在最后一个结果完成后开始,并更新结果到你自己的NSIndexSet,或NSMutableArray等。