Kann mich jemand auf Ressourcen zum Vergleich von Groß- und Kleinschreibung in Ziel C hinweisen? Es scheint keine äquivalente Methode zu habenstr1.equalsIgnoreCase(str2)
Kann mich jemand auf Ressourcen zum Vergleich von Groß- und Kleinschreibung in Ziel C hinweisen? Es scheint keine äquivalente Methode zu habenstr1.equalsIgnoreCase(str2)
Antworten:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
Die Dokumentation finden Sie unter Such- und Vergleichsmethoden
NSString
die einen Booleschen Wert zurückgibt. Wenn dann die empfangende Zeichenfolge ist nil
, wird die Methode als Ganzes zurückgegeben NO
.
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Hinweis: stringA &&
ist erforderlich , weil , wenn stringA
ist nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
und so passiert NSOrderedSame
ist auch definiert als 0
.
Das folgende Beispiel ist eine typische Falle:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
Eine Alternative, wenn Sie mehr Kontrolle als nur Groß- und Kleinschreibung wünschen, ist:
[someString compare:otherString options:NSCaseInsensitiveSearch];
Numerische Suche und diakritische Unempfindlichkeit sind zwei praktische Optionen.
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
Sie können vor dem Vergleich jederzeit sicherstellen, dass sie sich im selben Fall befinden:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Der Hauptvorteil besteht darin, dass Sie das von matm beschriebene potenzielle Problem beim Vergleich von Nullzeichenfolgen vermeiden. Sie können entweder überprüfen, ob die Zeichenfolge nicht Null ist, bevor Sie eine der compare:options:
Methoden ausführen, oder Sie können faul sein (wie ich) und die zusätzlichen Kosten für die Erstellung einer neuen Zeichenfolge für jeden Vergleich ignorieren (was minimal ist, wenn Sie nur eine ausführen oder zwei Vergleiche).
caseInsensitiveCompare
), verwenden Sie diesen immer.
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Ein neuer Weg, dies zu tun. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
für "Café" und "É" zurückkehrt, ist dies definitiv KEINE richtige Antwort.
Jason Cocos Antwort auf Swift für die zutiefst Faulen konvertieren :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
mit dem Präfix wie in der iPhone ContactApp zu überprüfen
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
Dieser Blog war nützlich für mich
Unter macOS können Sie einfach verwenden -[NSString isCaseInsensitiveLike:]
, was BOOL
genau wie zurückgibt -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"
von einem anderen Anruf empfangen werden und dies zufällig tunnil
, Ihrif
Willetrue
als SendencaseInsensitiveCompare
annil
gültig ist und zu einem anderen führtnil
, der in unserem Fall im Vergleich zuNSOrderedSame
Wille zurückkehrttrue
(NSOrderedSame
definiert als 0). Dies kann eine Quelle ziemlich verheerender Fehler sein, wie es in meinem Fall war. Prost!