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
NSString
któ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 stringA
jest nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
i tak się dzieje NSOrderedSame
jest 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 BOOL
tak 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
,if
podasztrue
jako, że wysłaniecaseInsensitiveCompare
nanil
jest ważne i skutkuje innym,nil
który w naszym przypadku w porównaniu zNSOrderedSame
powrócitrue
(NSOrderedSame
jest zdefiniowany jako 0). Może to być źródłem dość niszczycielskich błędów, tak jak w moim przypadku. Twoje zdrowie!