it-swarm.com.ru

Сравнение без учета регистра NSString

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

226
Tejaswi Yerukalapudi
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}

Документация находится в Методы поиска и сравнения

537
Jason Coco
 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
 }
48
ohho

Альтернатива, если вы хотите больше контроля, чем просто нечувствительность к регистру:

[someString compare:otherString options:NSCaseInsensitiveSearch];

Числовой поиск и диакритическая нечувствительность - два удобных варианта.

46
drawnonward

Вы всегда можете убедиться, что они в одном и том же случае перед сравнением:

if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
    // They're equal
}

Главное преимущество в том, что вы избегаете потенциальной проблемы, описанной matm, в отношении сравнения нулевых строк. Вы можете либо проверить, что строка не равна nil, прежде чем выполнять один из методов compare:options:, или вы можете быть ленивым (как я) и игнорировать добавочную стоимость создания новой строки для каждого сравнения (которая минимальна, если вы только делаете одно или два сравнения).

22
chrysAllwood

Новый способ сделать это. iOS 8

let string: NSString = "Café"
let substring: NSString = "É"

string.localizedCaseInsensitiveContainsString(substring) // true
7
iGo
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
7
WhirlWind

Попробуйте этот метод 

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
6
Reena

Преобразование ответа Джейсона Коко в Swift для глубоко ленивых :) 

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}
6
Tasik

проверить с префиксом как в iPhone ContactApp 

([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)

это блог был полезен для меня

5
iMeMyself

Альтернативное решение для Swift:

Чтобы сделать оба UpperCase:

например:

if ("ABcd".uppercased() == "abcD".uppercased()){
}

или сделать оба LowerCase:

например:

if ("ABcd".lowercased() == "abcD".lowercased()){
}
1
FARAZ

В macOS вы можете просто использовать -[NSString isCaseInsensitiveLike:], который возвращает BOOL точно так же, как -isEqual:.

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success
0
mangerlahn