2009-08-19 3 views
1

NSString의 NSArray에서 대/소문자를 구분하지 않는 조회를 수행하는 쉬운 방법이 있습니까? NSArray에 대한 참조는 inspectitively 대소 문자 구분을 언급하지만 조회에 대해서는 언급하지 않습니다.대/소문자를 구분하지 않는 NSArray의 indexOfObject

내 자신의 fn을 쉽게 작성할 수 있지만 더 쉬운 방법이 있는지 알고 싶습니다.

답변

11

이 작업을 수행하는 기본 제공 방법을 모른다. 물론

@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 전에 있는지 확인하기 위해 검사 유형의 비트를하고 싶은 것 그러나,이가하는있는 NSArray의 카테고리를 작성하는 사소한 것 -caseInsensitiveCompare:라고 부르지 만 아이디어를 얻을 수 있습니다.

+0

감사 매트. 그것은 내가 한 일이지만 로컬 기능에서만 가능합니다. 나는 ObjC에 매우 익숙하다. 그래서 나의 무지를 용서할 수있다. 그러나 당신이 배열을 반복하는 방법에 어떤 이점이 있는가? (NSUInteger i = 0; i

+0

아니요, 두 방법 모두 정상입니다. 특정 컴파일러 (또는 특정 컴파일러의 특정 모드)가 for 루프 내에서 변수 선언을 허용하지 않기 때문에 필자는 이런 식으로 작업하는 경향이 있습니다. 사람들이 컴파일러에 전달하는 플래그를 결코 확신 할 수 없으므로 여기에 게시 한 모든 코드를 모든 사람이 컴파일해야합니다. –

1

질문자,

는이 작업을 수행 할 수있는 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 내가 그것을 시도하지 않은하지만 당신은 자 NSPredicate와 배열을 필터링하여이 작업을 수행 할 수 있어야에만

0

없음 사용자 정의 카테고리가 없습니다 :

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