Controllo per l'uguaglianza in Objective-C
-
21-09-2019 - |
Domanda
Come faccio a verificare la chiave nel dizionario è uguale alla stringa nel parametro del metodo? vale a dire in seguito il codice, dictobj è oggetto di NSMutableDictionary, e per ogni chiave in dictobj ho bisogno di confrontare con lo spago. Come raggiungere questo obiettivo? Dovrei Typecase chiave per NSString ??
-(void)CheckKeyWithString:(NSString *)string
{
//foreach key in NSMutableDictionary
for(id key in dictobj)
{
//Check if key is equal to string
if(key == string)// this is wrong since key is of type id and string is of NSString,Control doesn't come into this line
{
//do some operation
}
}
}
Soluzione
Quando si utilizza l'operatore ==
, si confrontano i valori del puntatore. Questo funziona solo quando gli oggetti si confrontano sono esattamente lo stesso oggetto, allo stesso indirizzo di memoria. Ad esempio, il codice restituirà These objects are different
perché anche se le stringhe sono le stesse, sono memorizzati in luoghi diversi in memoria:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if(foo == bar)
NSLog(@"These objects are the same");
else
NSLog(@"These objects are different");
Quando si confrontano le stringhe, di solito si vuole confrontare il contenuto testuale delle stringhe piuttosto che i loro puntatori, così si dovrebbe il metodo -isEqualToString:
di NSString
. Questo codice restituirà These strings are the same
perché mette a confronto il valore degli oggetti stringa piuttosto che i loro valori di puntatore:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if([foo isEqualToString:bar])
NSLog(@"These strings are the same");
else
NSLog(@"These string are different");
Per confrontare arbitraria Objective-C oggetti si dovrebbe utilizzare il metodo isEqual:
più generale di NSObject
. -isEqualToString:
è una versione ottimizzata di -isEqual:
che si dovrebbe usare quando si sa che entrambi gli oggetti sono oggetti NSString
.
- (void)CheckKeyWithString:(NSString *)string
{
//foreach key in NSMutableDictionary
for(id key in dictobj)
{
//Check if key is equal to string
if([key isEqual:string])
{
//do some operation
}
}
}