Vérification de l'égalité dans Objective-C
-
21-09-2019 - |
Question
Comment puis-je vérifier la clé dans le dictionnaire est identique à la chaîne dans le paramètre de méthode? i.e. en dessous de code, dictobj est l'objet de NSMutableDictionary, et pour chaque clé dictobj i besoin de comparer avec la chaîne. Comment y parvenir? Au cas où je Typecase clé 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
}
}
}
La solution
Lorsque vous utilisez l'opérateur ==
, vous comparez les valeurs de pointeur. Cela ne fonctionnera que lorsque les objets que vous comparez sont exactement le même objet, à la même adresse de mémoire. Par exemple, ce code renvoie These objects are different
parce que même si les chaînes sont les mêmes, ils sont stockés à des endroits différents dans la mémoire:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if(foo == bar)
NSLog(@"These objects are the same");
else
NSLog(@"These objects are different");
Lorsque vous comparez des chaînes, vous voulez généralement de comparer le contenu textuel des chaînes plutôt que leurs pointeurs, vous devez donc la méthode -isEqualToString:
de NSString
. Ce code renvoie These strings are the same
car il compare la valeur des objets chaîne plutôt que leurs valeurs de pointeur:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if([foo isEqualToString:bar])
NSLog(@"These strings are the same");
else
NSLog(@"These string are different");
Pour comparer arbitraire Objective-C des objets, vous devez utiliser la méthode isEqual:
plus générale de NSObject
. -isEqualToString:
est une version optimisée de -isEqual:
que vous devez utiliser lorsque vous savez que les deux objets sont des objets 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
}
}
}