Di Objective-C, apa yang setara dengan kata kunci “instanceof” Jawa?


185

Saya ingin memeriksa apakah suatu objek (mis. someObject) Dapat dialihkan (dapat diubah-ubah) ke variabel jenis lain (mis SpecifiedType.). Di Jawa, saya bisa menulis:

someObject instanceof SpecifiedType

Pertanyaan terkait adalah menemukan apakah tipe runtime suatu objek sama dengan tipe lain. Di Jawa, saya bisa menulis:

someObject.getClass().equals(SpecifiedType.class)

Bagaimana ini bisa dilakukan di Objective-C?


Jawaban:


264

Cobalah [myObject class]untuk mengembalikan kelas suatu objek.

Anda dapat membuat perbandingan yang tepat dengan:

if ([myObject class] == [MyClass class])

tetapi tidak dengan menggunakan MyClasspengidentifikasi langsung .

Demikian pula, Anda dapat menemukan apakah objek tersebut adalah subkelas dari kelas Anda dengan:

if ([myObject isKindOfClass:[AnObject class]])

seperti yang disarankan oleh Jon Skeet dan zoul.


Bagaimana saya memeriksa kesetaraan dengan objek jenis "AnObject" misalnya?
Dimitris

"if ([myObject class] == [AnObject class])" atau, seperti yang disarankan oleh Jon Skeet dan zoul: "if ([myObject isKindOfClass: [AnObject class]])"
mouviciel

8
perbandingan tepat juga dapat dilakukan denganif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

Dari Wikipedia :

Dalam Objective-C, misalnya, generik Objectdan NSObject(dalam Cocoa / OpenStep) menyediakan metode isMemberOfClass:yang mengembalikan truejika argumen ke metode adalah turunan dari kelas yang ditentukan. Metode secara isKindOfClass:analog mengembalikan true jika argumen mewarisi dari kelas yang ditentukan.

isKindOfClass:akan paling dekat dengan instanceof, oleh suara itu.


9

Lihat metode isKindOfClass: dalam dokumentasi NSObject . (Kata peringatan yang biasa untuk pertanyaan seperti itu adalah bahwa memeriksa kelas objek sering merupakan tanda melakukan sesuatu yang salah.)


2
Hanya menyalin dari "jawaban" di bawah ini: "@ Zoul - mengapa menggunakan pemeriksaan tipe kelas dianggap buruk? Apakah ini bukan pemrograman defensif yang baik atau Anda berpendapat itu tidak perlu?"
Dan Rosenstark

1
Aha, terima kasih. Satu masalah adalah bahwa objek tidak harus dari kelas yang Anda harapkan. Selama pengujian itu sangat umum untuk lulus rintisan kelas yang menghormati antarmuka, tetapi memiliki kelas yang berbeda. Atau ketika Anda mengamati perubahan nilai menggunakan KVO ada sihir tertentu yang dilakukan dengan kelas. Kedua kasus cukup sah dan keduanya mudah rusak jika kode Anda melakukan pemeriksaan kelas eksplisit. Beralih perilaku di kelas adalah desain OO yang buruk, sangat erat dan sulit untuk diperluas. Saya tidak mengatakan tidak ada kasus penggunaan yang sah untuk pemeriksaan kelas, tetapi Anda harus berpikir dua kali sebelum melakukannya.
zoul

@ Zoul Dalam kasus khusus ini hanya akan menjadi pengalaman biasa, satu kemungkinan besar akan digunakan + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf
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.