Может ли кто-нибудь указать мне на какие-либо ресурсы о нечувствительном к регистру сравнении в Objective C? Кажется, у него нет эквивалентного метода для str1.equalsIgnoreCase(str2)
Нечувствительность к регистру NSString
Ответ 1
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Документация находится по адресу Методы поиска и сравнения
Ответ 2
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
}
Ответ 3
Альтернативой, если вы хотите больше контроля, чем просто нечувствительность к регистру:
[someString compare:otherString options:NSCaseInsensitiveSearch];
Числовой поиск и диакритическая нечувствительность - это два удобных варианта.
Ответ 4
Вы всегда можете убедиться, что они находятся в одном и том же случае перед сравнением:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Основным преимуществом является то, что вы избегаете потенциальной проблемы, описанной matm относительно сравнения строк nil. Вы могли бы либо проверить, что строка не равна нулю, либо сделать один из методов compare:options:
, либо вы можете быть ленивыми (например, я) и игнорировать добавленную стоимость создания новой строки для каждого сравнения (что минимально, если вы только выполнение одного или двух сравнений).
Ответ 5
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Ответ 6
Новый способ сделать это. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
Ответ 7
Попробуйте этот метод
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Ответ 8
Преобразование Джейсона Коко в ответ на Swift для глубоко ленивого:)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
Ответ 9
чтобы проверить с префиксом, как в iPhone ContactApp
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
этот блог был полезен для меня
Ответ 10
Альтернативное решение для быстрого:
Сделать обе UpperCase:
например:
if ("ABcd".uppercased() == "abcD".uppercased()){
}
или сделать обе снизу:
например:
if ("ABcd".lowercased() == "abcD".lowercased()){
}
Ответ 11
В macOS вы можете просто использовать -[NSString isCaseInsensitiveLike:]
, который возвращает BOOL
же, как -isEqual:
if ([@"Test" isCaseInsensitiveLike: @"test"])
// Success
Ответ 12
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];
}