Alguém pode me indicar algum recurso sobre comparação sem distinção entre maiúsculas e minúsculas no Objetivo C? Parece não ter um método equivalente parastr1.equalsIgnoreCase(str2)
Alguém pode me indicar algum recurso sobre comparação sem distinção entre maiúsculas e minúsculas no Objetivo C? Parece não ter um método equivalente parastr1.equalsIgnoreCase(str2)
Respostas:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
A documentação está localizada em Métodos de pesquisa e comparação
NSString
que retorna um booleano. Então, se a sequência de recebimento for nil
, o método como um todo retornará NO
.
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Nota: stringA &&
é necessário porque quando stringA
é nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
e assim acontece NSOrderedSame
também é definido como 0
.
O exemplo a seguir é uma armadilha típica:
NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
// what happens if "Rank" is not found in standardUserDefaults
}
Uma alternativa se você deseja ter mais controle do que apenas insensibilidade a maiúsculas e minúsculas é:
[someString compare:otherString options:NSCaseInsensitiveSearch];
Pesquisa numérica e insensibilidade diacrítica são duas opções úteis.
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
Você sempre pode garantir que eles estejam no mesmo caso antes da comparação:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
O principal benefício é evitar o possível problema descrito pelo matm em relação à comparação de cadeias nulas. Você pode verificar se a sequência não é nula antes de executar um dos compare:options:
métodos ou pode ser preguiçoso (como eu) e ignorar o custo adicional de criar uma nova sequência para cada comparação (o que é mínimo se você estiver fazendo apenas uma) ou duas comparações).
caseInsensitiveCompare
), sempre use isso.
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Uma nova maneira de fazer isso. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
para "Café" e "É", essa definitivamente NÃO é uma resposta correta.
Convertendo a resposta de Jason Coco a Swift para os profundamente preguiçosos :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
No macOS, você pode simplesmente usar -[NSString isCaseInsensitiveLike:]
, o que retorna BOOL
exatamente como -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"
é recebido de qualquer outra chamada e passa a sernil
, a suaif
vai dartrue
como enviarcaseInsensitiveCompare
paranil
é válido e resulta em um outronil
que, no nosso caso, em comparação comNSOrderedSame
retornarátrue
(NSOrderedSame
é definido como 0). Isso pode ser uma fonte de bugs bastante devastadores, como foi no meu caso. Felicidades!