NSArray的不区分大小写的indexOfObject

时间:2009-08-19 00:37:08

标签: objective-c nsarray

是否有一种简单的方法可以在NSStrings的NSArray中进行不区分大小写的查找? NSArray的参考文献提到对案例不敏感,但没有提及查找。

我可以轻松编写自己的fn来做这件事,但想知道是否有更简单的方法。

4 个答案:

答案 0 :(得分:12)

我不知道有任何内置方法可以做到这一点。但是,在NSArray上写一个类别是很简单的:

@interface NSArray (CaseInsensitiveIndexing)
- (NSUInteger)indexOfCaseInsensitiveString:(NSString *)aString;
@end

@implementation NSArray (CaseInsensitiveIndexing)

- (NSUInteger)indexOfCaseInsensitiveString:(NSString *)aString {
    NSUInteger index = 0;
    for (NSString *object in self) {
        if ([object caseInsensitiveCompare:aString] == NSOrderedSame) {
            return index;
        }
        index++;
    }
    return NSNotFound;
}   

@end

当然,在调用-caseInsensitiveCompare:之前,您可能想要进行一些类型检查以确保数组的项目 NSStrings,但您明白了。< / p>

答案 1 :(得分:2)

提问者,

在NSArray中编写类别是一个很好的想法来做到这一点。 它在我的应用程序中帮助了我很多。 然而,有一个更简单的方法来做这个 迭代数组。


@interface NSArray (CaseInsensitiveIndexing)
- (NSUInteger)indexOfCaseInsensitiveString:(NSString *)aString;
@end

@implementation NSArray (CaseInsensitiveIndexing)

- (NSUInteger)indexOfCaseInsensitiveString:(NSString *)aString 
{
   return [self indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) 
   { 
       return [[obj lowercaseString] isEqualToString:[aString lowercaseString]]; 
   }];
}   

@end

注意:indexOfObjectPassingTest仅适用于IOS 4.0

答案 2 :(得分:0)

我没有尝试过,但您应该可以通过使用NSPredicate过滤数组来实现此目的。

答案 3 :(得分:0)

无需自定义类别:

[myArray indexOfObjectPassingTest:^(NSString *obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
}]