Qualcuno può indicarmi qualsiasi risorsa sul confronto senza distinzione tra maiuscole e minuscole nell'Obiettivo C? Non sembra avere un metodo equivalente astr1.equalsIgnoreCase(str2)
Qualcuno può indicarmi qualsiasi risorsa sul confronto senza distinzione tra maiuscole e minuscole nell'Obiettivo C? Non sembra avere un metodo equivalente astr1.equalsIgnoreCase(str2)
Risposte:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
La documentazione si trova in Metodi di ricerca e confronto
NSString
che restituisce un valore booleano. Quindi se la stringa di ricezione è nil
, il metodo nel suo insieme restituisce NO
.
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Nota: stringA &&
è richiesto perché quando stringA
è nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
e così accade NSOrderedSame
è anche definito come 0
.
L'esempio seguente è una trappola tipica:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
Un'alternativa se si desidera un maggiore controllo della semplice insensibilità ai casi è:
[someString compare:otherString options:NSCaseInsensitiveSearch];
La ricerca numerica e l'insensibilità diacritica sono due opzioni utili.
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
Puoi sempre assicurarti che siano nello stesso caso prima del confronto:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
Il vantaggio principale è che eviti il potenziale problema descritto da matm riguardo al confronto di stringhe zero. Puoi verificare che la stringa non sia nulla prima di eseguire uno dei compare:options:
metodi, oppure potresti essere pigro (come me) e ignorare il costo aggiuntivo di creare una nuova stringa per ogni confronto (che è minimo se ne stai facendo solo uno o due confronti).
caseInsensitiveCompare
), usalo sempre.
Un nuovo modo per farlo. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
per "Café" e "É", questa NON è sicuramente una risposta corretta.
Conversione della risposta di Jason Coco in Swift per i profondamente pigri :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
Su macOS puoi semplicemente usare -[NSString isCaseInsensitiveLike:]
, che ritorna BOOL
esattamente come -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"
viene ricevuto da qualsiasi altra chiamata e sembra esserenil
, il vostroif
daràtrue
l'inviocaseInsensitiveCompare
anil
è valido e si traduce in un altronil
, che, nel nostro caso, confrontati conNSOrderedSame
torneràtrue
(NSOrderedSame
è definito come 0). Questo può essere una fonte di bug abbastanza devastanti, come nel mio caso. Saluti!