NSString: isEqual vs. isEqualToString


94

Jaka jest różnica między isEqual:i isEqualToString:?

Dlaczego klasy dodają metody isEqualTo * (isEqualToArray dla NSArray, isEqualToData dla NSData, ...) zamiast tylko nadpisywać isEqual:?

Odpowiedzi:


103

isEqual:porównuje ciąg z obiektem i zwróci wartość, NOjeśli obiekt nie jest łańcuchem. isEqualToString:jest szybsze, jeśli wiesz, że oba obiekty są ciągami znaków, zgodnie z dokumentacją :

Uwagi specjalne

Gdy wiesz, że oba obiekty są łańcuchami, ta metoda jest szybszym sposobem sprawdzenia równości niż isEqual:.

isEqualTo<Class>służy do zapewnienia określonych kontroli równości. Na przykład; isEqualToArray:sprawdza, czy tablice zawierają taką samą liczbę obiektów i czy obiekty o podanym indeksie wracają YESdo isEqual:testu.


3
Jeśli wierzysz Aaronowi Hillegassowi, to nie ma różnicy w wydajności, tylko odrobina bezpieczeństwa: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Dzięki za link - przydatne. Chociaż prosisz nas, abyśmy uwierzyli Markowi Dalrymple - temu, co robię :)
Abizern


16

Ponadto, w przypadku pisania własnych metod -isEqual:i -isEqualTo<Class>:metod, konwencją jest dopuszczenie zerowych argumentów dla -isEqual:i zgłoszenie wyjątku dla zerowych argumentów do-isEqualTo<Class>:


1
Nie spotkałem tego wcześniej, żadnej dokumentacji, którą znasz?
Mike Abdullah

2
Wydaje się, że nie jest to prawdą dla isEqualToString, który po prostu zwraca NO, jeśli przekażesz nil.
Jaka Jančar

9
Co ciekawe, jest to udokumentowane w sekcji Porównanie obiektów w <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Podstawy kursu</a>
Jonathan Dann

To nie jest prawda. isEqualToString nie zgłasza wyjątku.
respectTheCode

1
Na stronie internetowej Cocoa Fundamentals Guide jest napisane: „Ten dokument może nie reprezentować najlepszych praktyk w obecnym rozwoju”. Najwyraźniej jest stary.
cbh2000

5

Moje przypuszczenie jest to, że zapewnia lekką poprawę wydajności, jak isEqualToString: nie będzie trzeba wpisywać-czek, co przeszedł w.


Twoje przypuszczenie jest prawdopodobnie prawdziwe :)
Philip007

5

Poszerzanie wiedzy na @Abizern i @Jonathan Dann odpowiada zarówno na pytania, jak isEquali na isEqualToStringpracę z nilwartościami.

- (void)testStringEqual {
    NSString *string = nil;

    STAssertFalse([string isEqual:@"test"], @"NSString isEqual");
    STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString");

    // Note that these both return NO
    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");

    string = @"test";

    STAssertTrue([string isEqual:@"test"], @"NSString isEqual");
    STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString");

    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
}

4

Bardzo to polecam . Korzyści z wydajności wynikające z isEqualToString są w zasadzie pomijalne dla większości aplikacji. Ale są jeszcze dwie inne rozróżnienia, o których wspomina autor:

  • Bezpieczeństwo typów
  • Sposób niljest obsługiwany

Nie widzę żadnej różnicy w sposobie, w jaki nil jest traktowany przez obie. Be nil to odbiorca, argument lub jedno i drugie.
SayeedHussain

Cokolwiek „tego” już nie istnieje: /
Jared Grubb

1
Dzięki @JaredGrubb, znalazłem nowy adres URL.
Ben Packard,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.