Нечувствительность к регистру NSString

Может ли кто-нибудь указать мне на какие-либо ресурсы о нечувствительном к регистру сравнении в Objective C? Кажется, у него нет эквивалентного метода для str1.equalsIgnoreCase(str2)

Ответ 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];
}