是否有一种简单的方法可以在NSStrings的NSArray中进行不区分大小写的查找? NSArray的参考文献提到对案例不敏感,但没有提及查找。
我可以轻松编写自己的fn来做这件事,但想知道是否有更简单的方法。
答案 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);
}]