ฉันต้องการที่จะทดสอบว่าวัตถุที่เป็นประเภทหรือNSString
UIImageView
ฉันจะทำสิ่งนี้ได้อย่างไร มีวิธี "isoftype" บางประเภทหรือไม่?
ฉันต้องการที่จะทดสอบว่าวัตถุที่เป็นประเภทหรือNSString
UIImageView
ฉันจะทำสิ่งนี้ได้อย่างไร มีวิธี "isoftype" บางประเภทหรือไม่?
คำตอบ:
หากวัตถุของคุณเป็นmyObject
และคุณต้องการทดสอบเพื่อดูว่ามันเป็นNSString
รหัสจะเป็น:
[myObject isKindOfClass:[NSString class]]
ในทำนองเดียวกันถ้าคุณต้องการที่จะทดสอบmyObject
สำหรับUIImageView
:
[myObject isKindOfClass:[UIImageView class]]
คุณอาจจะใช้
- (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");
}
className
มันอาจทำงานได้หรือไม่ใช้กับ OS X แต่ไม่ใช่ใน iOS และไม่ได้มีไว้สำหรับใช้กับสิ่งนี้ นอกจากนี้สิ่งเหล่านั้นNSLog
ไม่ได้ทำในสิ่งที่ฉันคิดว่าคุณหมายถึงพวกเขา - พวกเขากำลังตรวจสอบชื่อคลาส (สตริงเสมอ) และคลาส coder แปลกแทนที่จะเป็นคลาสขององค์ประกอบที่แท้จริง
NSLog(@"Is of type: %@", [element class]);
จะทำงานใน iOS 7
เมื่อคุณต้องการแตกต่างระหว่าง 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 ทั้งสองครั้งเนื่องจากคลาสที่สืบทอดมานั้นเป็นคลาสซูเปอร์คลาส
isMemberOfClass:
จะกลับมาNO
เมื่อจัดการกับคลาสย่อย
ใช้การทดสอบอย่างง่ายฉันคิดว่าฉันจะทำเอกสารว่าอะไรดี บ่อยครั้งที่ฉันเห็นผู้คนกำลังตรวจสอบเพื่อดูว่าคลาสของวัตถุนั้นเป็นสมาชิกของคลาสอื่นหรือเท่ากับคลาสอื่น
สำหรับสายด้านล่างเรามีข้อมูลรูปแบบที่ไม่ดีบางอย่างที่สามารถจะเป็น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
ไม่ได้
คุณสามารถใช้ประโยชน์จากรหัสต่อไปนี้ในกรณีที่คุณต้องการตรวจสอบประเภทของชนิดข้อมูลดั้งเดิม
// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double))
ง่าย ๆ [คลาส yourobject] มันจะคืนค่าชื่อคลาสของ yourobject
Class
วัตถุ อย่างไรก็ตามdescription
วัตถุนี้จะเป็นชื่อคลาสเป็นสตริงดังนั้นคุณจึงยังสามารถเข้าสู่คอนโซลได้
[object isKindOfClass:[ClassName class]]