Brad Robinson
Brad Robinson

Reputation: 46797

Case insensitive indexOfObject for NSArray

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

Answers (4)

mattsson
mattsson

Reputation: 1349

No custom category needed:

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

Upvotes: 1

RegularExpression
RegularExpression

Reputation: 3541

I haven't tried it but you should be able to do this by filtering the array with an NSPredicate.

Upvotes: 0

RamaKrishna Chunduri
RamaKrishna Chunduri

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

Matt Ball
Matt Ball

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

Related Questions