Überprüfung auf Gleichheit in Objective-C
-
21-09-2019 - |
Frage
Wie kann ich den Schlüssel im Wörterbuch als String in Methodenparameter gleich ist? das heißt in folgenden Code, dictobj ist NSMutableDictionary des Objekts und für jeden Schlüssel in dictobj muss ich mit einer Schnur vergleichen. Wie dies zu erreichen? Sollte ich Setzkasten Schlüssel zu 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
}
}
}
Lösung
Wenn Sie den ==
Operator verwenden, vergleichen Sie Zeigerwerte. Dies funktioniert nur, wenn die Objekte, die Sie vergleichen sind genau das gleiche Objekt, an der gleichen Speicheradresse. Zum Beispiel wird dieser Code These objects are different
zurückkehren, denn obwohl die Saiten gleich sind, sie an verschiedenen Orten im Speicher abgelegt werden:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if(foo == bar)
NSLog(@"These objects are the same");
else
NSLog(@"These objects are different");
Wenn Sie Strings vergleichen, möchten Sie in der Regel den Textinhalt der Saiten zu vergleichen, anstatt ihre Zeiger, so sollten Sie die -isEqualToString:
Methode von NSString
. Dieser Code wird wieder These strings are the same
, weil es der Wert der Zeichenfolge vergleicht Objekte anstatt ihre Zeigerwerte:
NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if([foo isEqualToString:bar])
NSLog(@"These strings are the same");
else
NSLog(@"These string are different");
Zum Vergleich beliebigen Objective-C-Objekte Sie die allgemeinere isEqual:
Methode des NSObject
verwenden sollten. -isEqualToString:
ist eine optimierte Version von -isEqual:
, die Sie verwenden sollten, wenn Sie wissen beide Objekte sind NSString
Objekte.
- (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
}
}
}