Czy ktoś może wskazać mi jakiekolwiek zasoby dotyczące porównania bez rozróżniania wielkości liter w celu C? Wydaje się, że nie ma metody równoważnej dostr1.equalsIgnoreCase(str2)
Czy ktoś może wskazać mi jakiekolwiek zasoby dotyczące porównania bez rozróżniania wielkości liter w celu C? Wydaje się, że nie ma metody równoważnej dostr1.equalsIgnoreCase(str2)
Odpowiedzi:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Dokumentacja znajduje się w Metodach wyszukiwania i porównywania
NSStringktóra zwraca wartość logiczną. Następnie, jeśli ciąg otrzymujący jest nil, metoda jako całość zwraca NO.
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Uwaga: stringA && wymagane jest, bo gdy stringAjest nil:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
i tak się dzieje NSOrderedSamejest również zdefiniowany jako 0.
Poniższy przykład to typowa pułapka:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
Alternatywą, jeśli chcesz mieć większą kontrolę niż tylko rozróżnianie wielkości liter, jest:
[someString compare:otherString options:NSCaseInsensitiveSearch];
Wyszukiwanie numeryczne i niewrażliwość na znaki diakrytyczne to dwie przydatne opcje.
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
Zawsze możesz upewnić się, że są w tym samym przypadku przed porównaniem:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Główną korzyścią jest unikanie potencjalnego problemu opisanego przez matm dotyczącego porównywania ciągów zerowych. Możesz albo sprawdzić, czy łańcuch nie jest zerowy przed wykonaniem jednej z compare:options:metod, albo możesz być leniwy (jak ja) i zignorować dodatkowy koszt tworzenia nowego łańcucha dla każdego porównania (co jest minimalne, jeśli robisz tylko jedną lub dwa porównania).
caseInsensitiveCompare), Zawsze używaj tego.
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Nowy sposób na zrobienie tego. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true„Café” i „É”, to zdecydowanie NIE jest poprawna odpowiedź.
Konwersja odpowiedzi Jasona Coco na Swift dla głęboko leniwych :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
Na macOS możesz po prostu użyć -[NSString isCaseInsensitiveLike:], który zwraca BOOLtak jak -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"zostanie odebrane z innego połączenia i tak się stanienil,ifpodasztruejako, że wysłaniecaseInsensitiveComparenaniljest ważne i skutkuje innym,nilktóry w naszym przypadku w porównaniu zNSOrderedSamepowrócitrue(NSOrderedSamejest zdefiniowany jako 0). Może to być źródłem dość niszczycielskich błędów, tak jak w moim przypadku. Twoje zdrowie!