2009-08-19 5 views
1

Existe-t-il un moyen facile de faire une recherche insensible à la casse dans un NSArray de NSStrings? Référence pour NSArray mentionne le cas de tri insensiblement mais rien à propos de la recherche.Insensible à la casse indexOfObject pour NSArray

Je peux facilement écrire mon propre fn pour le faire mais je voudrais savoir s'il y a un moyen plus facile.

Répondre

11

Je ne connais pas de méthode intégrée pour ce faire. Cependant, il serait trivial d'écrire une catégorie sur NSArray qui fait cela:

@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 

Bien sûr, vous voudrez probablement faire un peu de vérification de type pour vous assurer que les éléments du tableau fait sont NSStrings avant vous appelez -caseInsensitiveCompare:, mais vous avez l'idée.

+0

Merci Matt. C'est à peu près ce que j'ai fait, mais juste dans une fonction locale. Je suis assez nouveau à ObjC alors pardonnez mon ignorance, mais y a-t-il un avantage à la façon dont vous avez itéré le tableau vs un simple "for (NSUInteger i = 0; i

+0

Non, les deux approches sont bien. J'ai tendance à faire les choses de cette façon, puisque certains compilateurs (ou même certains modes de certains compilateurs) n'autorisent pas la déclaration de variables dans la boucle for. Puisque vous ne pouvez jamais être sûr des drapeaux que les gens transmettent à leurs compilateurs, j'essaye de m'assurer que tout code que je poste ici devrait compiler pour tout le monde. –

1
questionneur

,

c'est une excellente idée d'écrire une catégorie NSArray pour ce faire. cela m'a beaucoup aidé dans mon application. Cependant, il existe un moyen beaucoup plus facile de faire cela à la place d'itération du tableau.


@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 fonctionne avec IOS 4.0 uniquement

0

Je ne l'ai pas essayé, mais vous devriez être en mesure de le faire en filtrant le tableau avec un NSPredicate.

0

Aucune catégorie personnalisée nécessaire:

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