ใน Objective-C ฉันจะทดสอบประเภทของวัตถุได้อย่างไร


557

ฉันต้องการที่จะทดสอบว่าวัตถุที่เป็นประเภทหรือNSString UIImageViewฉันจะทำสิ่งนี้ได้อย่างไร มีวิธี "isoftype" บางประเภทหรือไม่?


32
ใช่มี:[object isKindOfClass:[ClassName class]]
Philippe Leybaert

คำตอบ:


880

หากวัตถุของคุณเป็นmyObjectและคุณต้องการทดสอบเพื่อดูว่ามันเป็นNSStringรหัสจะเป็น:

[myObject isKindOfClass:[NSString class]]

ในทำนองเดียวกันถ้าคุณต้องการที่จะทดสอบmyObjectสำหรับUIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
โปรดทราบว่านอกจากนี้ยังมี isMemberOfClass: วิธีการที่จะตรวจสอบระดับ "แน่นอน" โปรดระวังด้วยว่าวัตถุของ Apple หลายชนิดเป็นประเภทของมูลนิธิแกนปลอม (. e กรัม NSString มักจะเป็นมากขึ้น NSCFString และ isMemberOfClass: จะกลับเท็จสำหรับการเปรียบเทียบนี้.)
เคโอทิส

3
หมายเหตุวิธีนี้ช้ามาก!
SAKrisT

ถูกต้องหรือไม่ที่รู้ว่า NSString เป็นกลุ่มของชั้นเรียน (เช่น NSNumber)
Ricardo

52

คุณอาจจะใช้

- (BOOL)isKindOfClass:(Class)aClass

NSObjectนี่คือวิธีการของ

สำหรับข้อมูลเพิ่มเติมตรวจสอบNSObjectเอกสาร

นี่คือวิธีที่คุณใช้สิ่งนี้

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

คุณอาจลองทำบางสิ่งเช่นนี้

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: อย่าใช้classNameมันอาจทำงานได้หรือไม่ใช้กับ OS X แต่ไม่ใช่ใน iOS และไม่ได้มีไว้สำหรับใช้กับสิ่งนี้ นอกจากนี้สิ่งเหล่านั้นNSLogไม่ได้ทำในสิ่งที่ฉันคิดว่าคุณหมายถึงพวกเขา - พวกเขากำลังตรวจสอบชื่อคลาส (สตริงเสมอ) และคลาส coder แปลกแทนที่จะเป็นคลาสขององค์ประกอบที่แท้จริง
andyvn22

5
สำหรับการตรวจสอบอย่างรวดเร็วนี้NSLog(@"Is of type: %@", [element class]); จะทำงานใน iOS 7
Portland Runner ใน

1
@PortlandRunner: นี่คือสิ่งที่ฉันกำลังมองหา IDK หากมีตั๋วที่ระบุสิ่งที่แน่นอนว่าดีกว่า แต่ถ้าไม่ใช่คุณควรสร้างบัตรขึ้นมา ถ้าคุณทำฉันจะบอกให้ฉันรู้และฉันจะลบคำตอบที่นั่นเพราะข้อมูลชิ้นนี้เป็นกำสำหรับฉัน ขอบคุณอีกครั้ง.
Matt Williams

15

เมื่อคุณต้องการแตกต่างระหว่าง superClass และ inheritedClass คุณสามารถใช้:

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

การใช้- (BOOL)isKindOfClass:(Class)aClassในกรณีนี้จะส่งผลให้เกิด TRUE ทั้งสองครั้งเนื่องจากคลาสที่สืบทอดมานั้นเป็นคลาสซูเปอร์คลาส


3
isMemberOfClass:จะกลับมาNOเมื่อจัดการกับคลาสย่อย
mipadi

11

ใช้การทดสอบอย่างง่ายฉันคิดว่าฉันจะทำเอกสารว่าอะไรดี บ่อยครั้งที่ฉันเห็นผู้คนกำลังตรวจสอบเพื่อดูว่าคลาสของวัตถุนั้นเป็นสมาชิกของคลาสอื่นหรือเท่ากับคลาสอื่น

สำหรับสายด้านล่างเรามีข้อมูลรูปแบบที่ไม่ดีบางอย่างที่สามารถจะเป็นNSArrayนักหรือ NSDictionary(null)

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

นี่คือการทดสอบที่ดำเนินการ:

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]);
}

isKindOfClassทำงานค่อนข้างดีในขณะที่isMemberOfClassไม่ได้


ฉันเห็นคุณแบ่งปันรหัสสำหรับการทดสอบ แต่ผลงานพิมพ์อยู่ที่ไหน
nuynait

แนวคิดสำหรับคุณที่จะคัดลอกรหัสของฉันและดูผลลัพธ์สำหรับสิ่งที่คุณต้องการ
Alex Zavatone

9

คุณสามารถใช้ประโยชน์จากรหัสต่อไปนี้ในกรณีที่คุณต้องการตรวจสอบประเภทของชนิดข้อมูลดั้งเดิม

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

5

ง่าย ๆ [คลาส yourobject] มันจะคืนค่าชื่อคลาสของ yourobject


1
จริง ๆ แล้วมันจะส่งคืนClassวัตถุ อย่างไรก็ตามdescriptionวัตถุนี้จะเป็นชื่อคลาสเป็นสตริงดังนั้นคุณจึงยังสามารถเข้าสู่คอนโซลได้
devios1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.