2011-11-15 13 views
14

Sto lavorando a un'app che controlla una matrice per vedere se contiene una determinata stringa. Tuttavia, non sembra funzionare correttamente, perché penso che potrebbe essere il caso della stringa. In questa riga di codice, come dovrei assicurarmi che contenga Object: non si fa distinzione tra maiuscole e minuscole?insensibilità alle maiuscole/minuscole in NSArray containsObject:

if ([myArray containsObject:term]) {...} 

Si prega di chiedere se avete bisogno di chiarimenti, e grazie per il vostro aiuto.

(Inoltre, ho trovato questa domanda: Case insensitive comparison NSString Non so se questo è quello che mi serve, e se è, come potrei usarlo.)

risposta

6

NSArray è (volutamente) ignorante di ciò che detiene. Pertanto, non è a conoscenza di NSString, molto meno della distinzione tra maiuscole e minuscole. Dovrai scorrere gli elementi dell'array e confrontarli. È possibile utilizzare uno dei tanti modi diversi di loop attraverso l'array:

  • objectEnumerator
  • indexOfObjectPassingTest: che utilizza blocchi di eseguire l'operazione.
  • chiamare objectAtIndex: per ogni articolo.

Suggerirei una delle prime 2 opzioni.

+0

dovrò guardare in questo quando ne ho la possibilità. Grazie! – thekmc

24
if ([myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
     return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame); 
    }] != NSNotFound) { 
    // there's at least one object that matches term case-insensitively 
} 
0
- (BOOL)containsObject:(id)anObject 

è un metodo comodo, che non è possibile applicare per il vostro scopo. Ecco la discussione documentazione:

Questo metodo determina se anObject è presente nella matrice da invio di un IsEqual: messaggio a ciascuno degli oggetti della matrice (e passando anObject come parametro ad ogni IsEqual: messaggio).

Il metodo di metodo NSObject generale isEqual: non può essere preso in considerazione per il caso dei caratteri di stringa. La soluzione migliore se puoi usare i blocchi (iOS 4) è probabilmente qualcosa come la proposta di Kevin Ballard. In caso contrario, potrebbe essere necessario scorrere le stringhe.

-1
if ([@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame) { 
    //... 
} 

questo può essere utile a voi ... Tutto il meglio

14

Ecco un approccio efficace utilizzando la codifica di valori-chiave.

NSArray *strings; // array of strings 
if ([[strings valueForKey:@"lowercaseString"] containsObject:[searchString lowercaseString]]) { 
    NSLog(@"searchString found"); 
} else { 
    NSLog(@"searchString NOT found"); 
} 

Swift 3 Opzione:

let things = ["foo", "Bar"] 
let searchString = "FOO" 

if things.contains(where: { $0.lowercased() == searchString.lowercased() }) { 
    print("found searchString") 
} else { 
    print("searchString not found") 
}