有没有一种简单的方法可以在 NSString 的 NSArray 中进行不区分大小写的查找?NSArray 的参考提到了不区分大小写的排序,但没有提到查找。
我可以轻松地编写自己的 fn 来做到这一点,但想知道是否有更简单的方法。
有没有一种简单的方法可以在 NSString 的 NSArray 中进行不区分大小写的查找?NSArray 的参考提到了不区分大小写的排序,但没有提到查找。
我可以轻松地编写自己的 fn 来做到这一点,但想知道是否有更简单的方法。
我不知道有任何内置方法可以做到这一点。但是,在 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:
,但您明白了。
提问者,
在 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
无需自定义类别:
[myArray indexOfObjectPassingTest:^(NSString *obj, NSUInteger idx, BOOL *stop){
return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
}]
我还没有尝试过,但是您应该可以通过使用 NSPredicate 过滤数组来做到这一点。