NSString: isEqual vs. isEqualToString


94

Apa perbedaan antara isEqual:dan isEqualToString:?

Mengapa kelas menambahkan metode isEqualTo * (isEqualToArray untuk NSArray, isEqualToData untuk NSData, ...) alih-alih hanya menimpa isEqual:?

Jawaban:


103

isEqual:membandingkan string ke objek, dan akan mengembalikan NOjika objek tersebut bukan string. isEqualToString:lebih cepat jika Anda mengetahui kedua objek tersebut adalah string, seperti yang dinyatakan dalam dokumentasi :

Pertimbangan Khusus

Jika Anda mengetahui bahwa kedua objek adalah string, metode ini adalah cara yang lebih cepat untuk memeriksa persamaan daripada isEqual:.

isEqualTo<Class>digunakan untuk memberikan pemeriksaan khusus untuk kesetaraan. Misalnya; isEqualToArray:memeriksa bahwa array berisi jumlah objek yang sama, dan bahwa objek pada indeks tertentu kembali YESuntuk isEqual:pengujian.


3
Jika Anda yakin Aaron Hillegass maka tidak ada perbedaan kinerja, hanya sedikit jenis keselamatan: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Terima kasih untuk tautannya - berguna. Meskipun Anda meminta kami untuk mempercayai Mark Dalrymple - yang saya lakukan :)
Abizern


16

Selain itu, untuk menulis sendiri -isEqual:dan -isEqualTo<Class>:metode Anda, konvensi adalah mengizinkan nihil argumen untuk -isEqual:dan memunculkan pengecualian untuk argumen nil untuk-isEqualTo<Class>:


1
Saya belum pernah menemukan ini sebelumnya, dokumentasi apa saja yang Anda ketahui?
Mike Abdullah

2
Ini tampaknya tidak benar untuk isEqualToString, yang hanya mengembalikan NO jika Anda meneruskan nil.
Jaka Jančar

9
Menarik, ini didokumentasikan di bagian Perbandingan Objek di <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Panduan Dasar</i>
Jonathan Dann

Ini tidak benar. isEqualToString tidak memunculkan pengecualian.
respekTheCode

1
Halaman web Panduan Dasar Kakao mengatakan, "Dokumen ini mungkin tidak mewakili praktik terbaik untuk pengembangan saat ini." Sepertinya sudah tua.
cbh2000

5

Dugaan saya adalah ini memberikan sedikit peningkatan kinerja, karena isEqualToString: tidak perlu memeriksa jenis apa yang diteruskan.


Tebakan Anda mungkin benar :)
Philip007

5

Memperluas jawaban @Abizern dan @Jonathan Dann, keduanya isEqualdan isEqualToStringbekerja dengan nilnilai.

- (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

Saya sangat merekomendasikan ini . Manfaat kinerja isEqualToString pada dasarnya dapat diabaikan untuk sebagian besar aplikasi. Tetapi ada dua perbedaan lain yang disebutkan penulis:

  • Ketik keamanan
  • Cara nilditangani

Saya tidak melihat perbedaan dalam cara nihil ditangani oleh keduanya. Nihil menjadi penerima atau argumen atau keduanya.
SayeedHussain

Apapun "ini" sudah tidak ada lagi: /
Jared Grubb

1
Terima kasih @JaredGrubb, saya menemukan URL baru.
Ben Packard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.