NSStrings の NSArray で大文字と小文字を区別しないルックアップを行う簡単な方法はありますか? NSArray の参照では、大文字と小文字を区別せずに並べ替えることが言及されていますが、ルックアップについては何も言及されていません。
それを行うために自分の fn を簡単に書くことができますが、もっと簡単な方法があるかどうか知りたいです。
NSStrings の NSArray で大文字と小文字を区別しないルックアップを行う簡単な方法はありますか? NSArray の参照では、大文字と小文字を区別せずに並べ替えることが言及されていますが、ルックアップについては何も言及されていません。
それを行うために自分の fn を簡単に書くことができますが、もっと簡単な方法があるかどうか知りたいです。
これを行う組み込みの方法はわかりません。ただし、これを行う 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:
が、その考えは理解できます。
質問者様、
これを行うために 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 でのみ機能します。
カスタム カテゴリは不要:
[myArray indexOfObjectPassingTest:^(NSString *obj, NSUInteger idx, BOOL *stop){
return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
}]
私は試していませんが、NSPredicate で配列をフィルタリングすることでこれを実行できるはずです。