Ответ 1
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Документация находится по адресу Методы поиска и сравнения
Может ли кто-нибудь указать мне на какие-либо ресурсы о нечувствительном к регистру сравнении в Objective C? Кажется, у него нет эквивалентного метода для str1.equalsIgnoreCase(str2)
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Документация находится по адресу Методы поиска и сравнения
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Примечание: stringA &&
требуется, потому что, когда stringA
есть nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
и поэтому бывает, что NSOrderedSame
также определяется как 0
.
Следующий пример - типичная ошибка:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
Альтернативой, если вы хотите больше контроля, чем просто нечувствительность к регистру:
[someString compare:otherString options:NSCaseInsensitiveSearch];
Числовой поиск и диакритическая нечувствительность - это два удобных варианта.
Вы всегда можете убедиться, что они находятся в одном и том же случае перед сравнением:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Основным преимуществом является то, что вы избегаете потенциальной проблемы, описанной matm относительно сравнения строк nil. Вы могли бы либо проверить, что строка не равна нулю, либо сделать один из методов compare:options:
, либо вы можете быть ленивыми (например, я) и игнорировать добавленную стоимость создания новой строки для каждого сравнения (что минимально, если вы только выполнение одного или двух сравнений).
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Новый способ сделать это. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
Попробуйте этот метод
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Преобразование Джейсона Коко в ответ на Swift для глубоко ленивого:)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
чтобы проверить с префиксом, как в iPhone ContactApp
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
этот блог был полезен для меня
Альтернативное решение для быстрого:
Сделать обе UpperCase:
например:
if ("ABcd".uppercased() == "abcD".uppercased()){
}
или сделать обе снизу:
например:
if ("ABcd".lowercased() == "abcD".lowercased()){
}
В macOS вы можете просто использовать -[NSString isCaseInsensitiveLike:]
, который возвращает BOOL
же, как -isEqual:
if ([@"Test" isCaseInsensitiveLike: @"test"])
// Success
NSMutableArray *arrSearchData;
NSArray *data=[arrNearByData objectAtIndex:i];
NSString *strValue=[NSString stringWithFormat:@"%@", [data valueForKey:@"restName"]];
NSRange r = [strValue rangeOfString:key options:NSCaseInsensitiveSearch];
if(r.location != NSNotFound)
{
[arrSearchData addObject:data];
}