Чи може хто-небудь вказати мені на будь-які ресурси щодо порівняння нечутливих до обставин у «Цілі 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). Це може бути джерелом досить руйнівних помилок, як це було в моєму випадку. Ура!