2013-07-19 30 views
8

Mam dwa NSDictionaries zawierające NSStrings. Aby porównać te dwa słowniki, używam metody isEqualToDictionary:. Dokumentacja na isEqualToDictionary: mówi: "Dwa słowniki mają taką samą zawartość, jeśli każda z nich ma taką samą liczbę wpisów, a dla danego klucza odpowiadające obiekty wartości w każdym słowniku spełniają test isEqual: test."Porównaj NSDictionaries zawierające NSStrings

Więc moje struny są porównywane metodą isEqual:.

Pytanie brzmi:
Jak działa isEqual: dla urządzenia NSString?

Czy używa ona isEqual: z NSObject? Przeczytałem, że isEqual z NSObject tylko porównuje adresy, używając ==. Aby udowodnić lub obalić tę ideę Napisałem próbki:

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

result jest YES, adresy str1 i str2 różnią się jednak.
Tak więc albo nie używa ona isEqual: z (czym niż?), Albo NSObject 's isEqual: robi coś bardziej skomplikowanego niż po prostu sprawdzanie równości adresów.

Czy ktoś wie, jak to działa?

+0

Dlaczego nie można użyć metody isEqualToString? zbyt łatwe? –

+0

@SamBudda To nie ja, to NSDictionary używa isEqual: porównywania jego elementów. – Anastasia

Odpowiedz

10

NSString zastępuje isEqual:, aby poprawnie porównać ciągi znaków, więc doskonale nadaje się do porównywania słowników w ten sposób.

+0

Dzięki. Czy jest jakiś sposób, aby się tego upewnić? Nagłówki i dokumentacja dla NSString nic nie mówią. – Anastasia

+0

Znalazłem to, o czym wspomniałem w "Programowaniu Objective-c: The Big Nerd Ranch Guide". – Anastasia

+0

@Anastasia Ponadto jest bardzo pośrednie wymienione w Dokumentach obszarze [ 'isEqualToString: '] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString. html # // apple_ref/occ/instm/NSString/isEqualToString :), który mówi, że jest taki sam jak 'isEqual:' gdy oba są łańcuchami, ale szybsze. – cobbal

5

isEqualToDictionary porównuje każdy obiekt z isEqual.

W moim przypadku to nie działa z obiektu NSString w moim słowniku. Więc zrobiłem bardzo proste obejście. Porównuję opis obu słowników. Działa to ze słownikami zawierającymi NSString i NSNumber oraz whit wszystkie obiekty zawierające metodę opisu.

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

Porównaj dosłownych opisów słowników. Używam go w testach jednostkowych.

+0

Ale co, jeśli klucze i wartości nie są w tej samej kolejności? czy nadal będzie działać? –

+0

'NSDictionary' nie jest uporządkowany myślę. – Geri