Чи може хто-небудь вказати мені на будь-які ресурси щодо порівняння нечутливих до обставин у «Цілі C»? Схоже, він не має аналогічного методуstr1.equalsIgnoreCase(str2)
Чи може хто-небудь вказати мені на будь-які ресурси щодо порівняння нечутливих до обставин у «Цілі 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
}
Основна вигода полягає в тому, що ви уникаєте потенційної проблеми, описаної математикою, щодо порівняння нульових рядків. Ви можете або перевірити рядок не нульовою, перш ніж виконувати один із 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). Це може бути джерелом досить руйнівних помилок, як це було в моєму випадку. Ура!