2

有没有一种简单的方法可以在 NSString 的 NSArray 中进行不区分大小写的查找?NSArray 的参考提到了不区分大小写的排序,但没有提到查找。

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

4

4 回答 4

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

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

于 2009-08-19T00:56:24.833 回答
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

于 2010-11-15T05:55:32.937 回答
1

无需自定义类别:

[myArray indexOfObjectPassingTest:^(NSString *obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
}]
于 2017-08-09T14:46:07.067 回答
0

我还没有尝试过,但是您应该可以通过使用 NSPredicate 过滤数组来做到这一点。

于 2013-06-09T23:55:06.273 回答