Может кто-нибудь указать мне какие-либо ресурсы о сравнении без учета регистра в 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). Это может быть источником довольно разрушительных ошибок, как это было в моем случае. Ура!