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]]
mmc
sumber
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");    
}
Bryan Hare
sumber
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.

Yedy
sumber
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.

Alex Zavatone
sumber
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)) 
Bajju
sumber
5

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

AMohan
sumber
1
Sebenarnya itu akan mengembalikan Classobjek. Namun, descriptionobjek ini akan menjadi nama kelas sebagai string, sehingga Anda masih dapat mencatatnya di konsol.
devios1