2013-07-19 15 views
8

Ich habe zwei NSDictionaries mit NSStrings. Um diese zwei Wörterbücher zu vergleichen, verwende ich isEqualToDictionary: Methode. Die Dokumentation auf isEqualToDictionary: sagtVergleichen NSDictionaries mit NSStrings

"Zwei Wörterbücher haben gleiche Inhalte, wenn sie jeweils die gleiche Anzahl von Einträgen und für einen bestimmten Schlüssel die entsprechenden Wert Objekte in jedem Wörterbuch erfüllen die isEqual: Test."

So werden meine Strings durch isEqual: Methode verglichen.

Die Frage ist:
Wie funktioniert isEqual: Arbeit für die NSString?

Verwendet es isEqual: von NSObject? Ich habe gelesen, dass von NSObject vergleicht nur Adressen, mit ==. Um zu beweisen, oder diese Idee widerlegen ich eine Probe schrieb:

NSString *str1 = @"sampleString"; 
NSString *str2 = [NSString stringWithFormat:@"%@", @"sampleString"]; 
BOOL result = [str1 isEqual:str2]; 

Die result ist YES, die Adressen von str1 und str2 sind allerdings unterschiedlich.
isEqual: aus NSObject (was dann?), Oder NSObjectisEqual: tut etwas komplizierter als nur Überprüfung der Gleichheit der Adressen.

Weiß jemand, wie es wirklich funktioniert?

+0

Warum können Sie die isEqualToString-Methode nicht verwenden? zu einfach? –

+0

@SamBudda Es ist nicht ich, es ist NSDictionary verwendet isEqual: seine Elemente zu vergleichen. – Anastasia

Antwort

10

NSString überschreibt isEqual:, um Zeichenketten richtig zu vergleichen. Sie können also Wörterbücher auf diese Weise vergleichen.

+0

Danke. Gibt es eine Möglichkeit, sich davon zu überzeugen? Header und Dokumentation für NSString sagt nichts. – Anastasia

+0

Ich fand es, diese Tatsache wird in "Objective-C Programmierung: The Big Nerd Ranch Guide" erwähnt. – Anastasia

+0

@Anastasia Es wird auch sehr indirekt in den Dokumenten unter ['isEqualToString:'] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString) erwähnt. html # // apple_ref/occ/instm/NSString/isEqualToString :) was sagt, es ist das gleiche wie 'isEqual:' wenn beide Zeichenfolgen sind, aber schneller. – cobbal

5

isEqualToDictionary vergleicht jedes Objekt mit isEqual.

In meinem Fall funktioniert es nicht mit NSString-Objekt in meinem Wörterbuch. Also habe ich einen sehr einfachen Workaround gemacht. Ich vergleiche die Beschreibung beider Wörterbücher. Dies funktioniert mit Wörterbüchern, die NSString und NSNumber enthalten und alle Objekte enthalten, die eine Beschreibungsmethode enthalten.

[[myDict1 description] isEqualToString:[myDict2 description]] 
1

Vergleichen wörtlichen Beschreibungen von Wörterbüchern. Ich benutze es in Unit Tests.

NSString *a = dictionary.description; 
NSString *b = assertation.description; 
BOOL test = [a isEqualToString:b]; 
+0

Aber was, wenn die Schlüssel und Werte nicht in der gleichen Reihenfolge sind? Wird es noch funktionieren? –

+0

'NSDictionary' ist nicht bestellt, denke ich. – Geri

Verwandte Themen