Reputation: 46797
Is there an easy way to do a case insensitive lookup in an NSArray of NSStrings? Reference for NSArray mentions sorting case insensitively but nothing about lookup.
I can easily write my own fn to do it but would like to know if there's an easier way.
Upvotes: 2
Views: 3287
Reputation: 1349
No custom category needed:
[myArray indexOfObjectPassingTest:^(NSString *obj, NSUInteger idx, BOOL *stop){
return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
}]
Upvotes: 1
Reputation: 3541
I haven't tried it but you should be able to do this by filtering the array with an NSPredicate.
Upvotes: 0
Reputation: 1130
questioner ,
it's an excellent idea of writing a category in NSArray to do this . it helped me a lot in my app. However there's a pretty much easier way to do the this instead of iterating the array.
@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
Note :indexOfObjectPassingTest works with IOS 4.0 only
Upvotes: 2
Reputation: 6618
I don't know of any built-in way to do this. However, it would be trivial to write a category on NSArray which does this:
@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
Of course, you'd probably want to do a bit of type checking to make sure the array's items actually are NSStrings before you call -caseInsensitiveCompare:
, but you get the idea.
Upvotes: 12