Di Objective-C, bagaimana cara menguji jenis objek?


Jawaban:


880

Jika objek Anda adalah myObject, dan Anda ingin menguji untuk melihat apakah itu adalah NSString, kodenya adalah:

[myObject isKindOfClass:[NSString class]]

Demikian juga, jika Anda ingin menguji myObjectuntuk UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
Perhatikan bahwa ada juga metode isMemberOfClass: yang akan memeriksa kelas "ketepatan." Berhati-hatilah dengan itu, karena banyak objek Apple yang sebenarnya adalah tipe Core Foundation yang menyamar. (. Misalnya NSString lebih sering merupakan NSCFString, dan isMemberOfClass: akan kembali palsu untuk perbandingan ini.)
Craig Otis

3
Perhatikan metode ini sangat lambat!
SAKrisT

Apakah benar mengetahui bahwa NSString adalah gugus kelas? (seperti NSNumber)
Ricardo

52

Anda mungkin akan menggunakan

- (BOOL)isKindOfClass:(Class)aClass

Ini adalah metode NSObject.

Untuk info lebih lanjut, periksa NSObjectdokumentasi.

Ini adalah bagaimana Anda menggunakan ini.

BOOL test = [self isKindOfClass:[SomeClass class]];

Anda mungkin juga mencoba melakukan hal seperti ini

for(id element in myArray)
{
    NSLog(@"=======================================");
    NSLog(@"Is of type: %@", [element className]);
    NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
    NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");    
}

4
-1: Jangan gunakan className, mungkin atau tidak bisa berfungsi pada OS X, tapi tidak di iOS dan itu tidak dimaksudkan untuk digunakan untuk ini. Juga, mereka NSLogtidak melakukan apa yang saya pikir Anda maksudkan - mereka memeriksa nama kelas (selalu string) dan kelas coder, anehnya, bukan kelas elemen aktual.
andyvn22

5
Untuk pemeriksaan cepat ini: NSLog(@"Is of type: %@", [element class]); akan berfungsi di iOS 7
Portland Runner

1
@ PortlandRunner: Inilah yang saya cari. IDK jika ada tiket yang menangani hal itu dengan lebih baik, tetapi jika tidak, Anda harus membuatnya. Jika ya, saya beri tahu saya dan saya akan menjawab dengan suara keras di sana, karena cuplikan ini cocok untuk saya. Terima kasih lagi.
Matt Williams

15

Saat Anda ingin membedakan antara kelas super dan kelas bawaan, Anda dapat menggunakan:

if([myTestClass class] == [myInheritedClass class]){
   NSLog(@"I'm the inheritedClass);
} 
if([myTestClass class] == [mySuperClass class]){
   NSLog(@"I'm the superClass);
} 

Penggunaan - (BOOL)isKindOfClass:(Class)aClassdalam kasus ini akan menghasilkan TRUE dua kali karena inheritClass juga merupakan jenis superClass.


3
isMemberOfClass:akan kembali NOketika berhadapan dengan subclass.
mipadi

11

Menjalankan tes sederhana, saya pikir saya akan mendokumentasikan apa yang berhasil dan yang tidak. Seringkali saya melihat orang memeriksa untuk melihat apakah kelas objek adalah anggota dari kelas lain atau sama dengan kelas lainnya.

Untuk baris di bawah ini, kami memiliki beberapa data yang terbentuk dengan buruk yang dapat berupa NSArray,, NSDictionaryatau (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

Ini adalah tes yang dilakukan:

NSLog(@"%@", [hits class]);

if ([hits isMemberOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

isKindOfClassbekerja lebih baik sementara isMemberOfClasstidak.


Saya melihat Anda membagikan kode untuk tes. Tapi di mana hasil cetakannya?
nuynait

Idenya bagi Anda untuk menyalin kode saya dan melihat hasilnya untuk apa yang Anda butuhkan.
Alex Zavatone

9

Anda dapat menggunakan kode berikut jika Anda ingin memeriksa tipe tipe data primitif.

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 

5

Sederhana, [kelas objek] akan mengembalikan nama kelas objek Anda.


1
Sebenarnya itu akan mengembalikan Classobjek. Namun, descriptionobjek ini akan menjadi nama kelas sebagai string, sehingga Anda masih dapat mencatatnya di konsol.
devios1
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.