Индекс нечувствительный к регистру для NSArray

Есть ли простой способ сделать поиск без учета регистра в NSArray из NSStrings? Ссылка на NSArray упоминает сортировку без учета регистра, но ничего о поиске.

Я могу легко написать свой собственный fn, но хотел бы знать, есть лиЭто более простой способ.

Ответы на вопрос(4)

но вы должны сделать это, отфильтровав массив с помощью NSPredicate.

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

Это'Отличная идея написать категорию в 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

Решение Вопроса

тривиально написать категорию на 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:, Но ты получил идею.

 Matt Ball20 авг. 2009 г., 01:17
Нет, оба подхода хороши. Я склонен так поступать, поскольку некоторые компиляторы (или даже определенные режимы определенных компиляторов) неt разрешить объявление переменной в цикле for. Поскольку вы никогда не можете быть уверены, какие флаги люди передают своим компиляторам, я стараюсь сделать так, чтобы любой код, который я публикую здесь, должен компилироваться для всех.
 Brad Robinson20 авг. 2009 г., 00:58
Спасибо Мэтт. Тот'в значительной степени то, что я сделал, но только в локальной функции. Я'Я довольно новичок в ObjC, так что извините за мое невежество, но есть ли преимущество в том, как выитерировал массив против простогоfor (NSUInteger i = 0; i <self.count; i ++) ... [self objectAtIndex: i] "??

Ваш ответ на вопрос