Может кто-нибудь указать мне какие-либо ресурсы о сравнении без учета регистра в Objective C? Кажется, он не имеет эквивалентного методаstr1.equalsIgnoreCase(str2)
Может кто-нибудь указать мне какие-либо ресурсы о сравнении без учета регистра в Objective C? Кажется, он не имеет эквивалентного методаstr1.equalsIgnoreCase(str2)
Ответы:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Документация находится в разделе Методы поиска и сравнения.
NSString
которая возвращает логическое значение. Затем, если получена строка nil
, метод в целом возвращается NO
.
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 ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
Вы всегда можете убедиться, что они в одном и том же случае перед сравнением:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Главное преимущество в том, что вы избегаете потенциальной проблемы, описанной matm, в отношении сравнения нулевых строк. Вы можете либо проверить, что строка не равна нулю, прежде чем выполнять один из compare:options:
методов, или вы можете быть ленивым (как я) и игнорировать добавочную стоимость создания новой строки для каждого сравнения (которая минимальна, если вы делаете только один). или два сравнения).
caseInsensitiveCompare
), поддерживаемое языком , всегда используйте это.
Новый способ сделать это. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
«Café» и «É», это определенно НЕ правильный ответ.
Преобразование ответа Джейсона Коко в Свифта для глубоко ленивых :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
На 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];
}
@"Some String"
принимается от любого другого вызова и случаетсяnil
, вашif
будет давать ,true
как отправкаcaseInsensitiveCompare
вnil
корректен и приводит к другой ,nil
который, в нашем случае, по сравнению сNSOrderedSame
возвратитtrue
(NSOrderedSame
определяется как 0). Это может быть источником довольно разрушительных ошибок, как это было в моем случае. Ура!