ความแตกต่างของ iOS ระหว่าง isKindOfClass และ isMemberOfClass


152

ความแตกต่างระหว่างisKindOfClass:(Class)aClassและisMemberOfClass:(Class)aClassฟังก์ชั่นคืออะไร? ฉันรู้ว่ามันเป็นเรื่องเล็ก ๆ น้อย ๆ อย่างหนึ่งคือทั่วโลกในขณะที่อีกรายการหนึ่งเป็นการแข่งขันที่ตรงกับคลาส

ในสวิฟท์และisKind(of aClass: AnyClass)isMember(of aClass: AnyClass)

คำตอบ:


264

isKindOfClass:ส่งคืนYESถ้าผู้รับเป็นตัวอย่างของคลาสที่ระบุหรืออินสแตนซ์ของคลาสใด ๆ ที่สืบทอดจากคลาสที่ระบุ

isMemberOfClass:ส่งคืนYESหากและต่อเมื่อผู้รับเป็นตัวอย่างของคลาสที่ระบุ

เวลาส่วนใหญ่ที่คุณต้องการใช้isKindOfClass:เพื่อให้แน่ใจว่ารหัสของคุณยังทำงานร่วมกับคลาสย่อย

การอ้างอิงโปรโตคอล NSObjectพูดถึงวิธีการเหล่านี้เพิ่มเติมเล็กน้อย


คุณช่วยเคลียร์ข้อสงสัยด้านล่างของฉันได้ไหม? ถ้า ([lbl.textColor isMemberOfClass: [คลาส UIColor]]) {// ไม่ใช่ Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } ถ้า ([imgView.image isMemberOfClass: [คลาส UIImage]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Nikkie

82
  • isKindOfClass:บ่งชี้ว่าวัตถุสืบทอดมาจากคลาสที่กำหนด
  • isMemberOfClass:บ่งชี้ว่าวัตถุเป็นตัวอย่างของคลาสที่กำหนด

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

@Durga หากตอบคำถามของคุณคุณควรยอมรับมัน อ่านเพิ่มเติมเกี่ยวกับอัตราการยอมรับได้ที่นี่: meta.stackexchange.com/questions/16721/…
poncha

1
isKindOfClass จะส่งคืนค่า YES ด้วยถ้าวัตถุเป็นตัวอย่างของคลาสที่กำหนด ในคำอื่น ๆ isMemberOfClass เป็นชุดย่อยของ isKindOfClass
สกูตเตอร์

48

สมมติ

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

แล้วก็

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

โดยพื้นฐานแล้ว-isMemberOfClass:จะเป็นจริงถ้าอินสแตนซ์นั้นตรงกับคลาสที่ระบุทั้งหมดในขณะที่-isKindOfClass:เป็นจริงถ้าอินสแตนซ์นั้นตรงกับคลาสที่ระบุหรือถ้าหนึ่งในบรรพบุรุษของอินสแตนซ์นั้นเป็นคลาสที่ระบุ

-isMemberOfClass: ใช้บ่อย


1
แต่ถ้าคุณมีอาร์เรย์ของการดูย่อยซึ่งรวมถึง UIViews และ UISegmentedControl และคุณวนลูปผ่านพวกเขาและตั้งเงื่อนไขในชั้นเรียนคุณจะต้องใช้ isMemberOfClas UIView และ isMemberOfClass UISegmentedControl เพื่อแยกแยะระหว่างพวกเขาไม่? isKindOfClass จะเห็น UISegmentedControl เป็น UIView
PruitIgoe

@ Fruitlgoe ที่เป็นจริงมาก คุณอาจใช้ isKindOfClass: [UIView class] เพื่อให้แน่ใจว่าวัตถุทั้งหมดที่คุณติดต่อด้วยเป็น UIViews แต่คุณจะต้องใช้ isMemberOfClass: [UIView class] และ / หรือ isMemberOfClass: [UISegmentedControl class] ภายในคำสั่งแบบมีเงื่อนไขใด ๆ ของมุมมองขึ้นอยู่กับคลาสอินสแตนซ์ของพวกเขาทันที
NoodleOfDeath

9

isKindOfClass : ส่งคืนค่าบูลีนที่ระบุว่าผู้รับเป็นอินสแตนซ์ของคลาสที่กำหนดหรืออินสแตนซ์ของคลาสใด ๆ ที่สืบทอดจากคลาสนั้น

isMemberOfClass : ส่งคืนค่าบูลีนที่ระบุว่าผู้รับเป็นอินสแตนซ์ของคลาสที่กำหนดหรือไม่


2

isKindOfClass-> return YES เมื่อวัตถุเป็นตัวอย่างของคลาสหรืออินสแตนซ์ของคลาสที่สืบทอดมาจากมัน

isMemberOfClass: คืนค่า YES เมื่อวัตถุเป็นอินสแตนซ์ของคลาสนั้น แต่ไม่ใช่ในกรณี: อินสแตนซ์ของคลาสที่สืบทอดมาจากคลาสนั้น

ตัวอย่างดีพอในคำตอบ jtbandes


0

เนื่องจากกลุ่มคลาส isMemberOfClass สามารถให้คำตอบที่คุณอาจไม่คาดคิด ในหลายกรณีทางเลือกที่ดีที่สุดของคุณมีแนวโน้มที่จะเป็น - (BOOL) เป็นไปตาม ToProtocol: (SEL) aSelector หรือ - (BOOL) เป็นไปตาม ToProtocol: (Protocol *) aProtocol นั่นคือการทดสอบเหล่านี้ดีกว่าหากพวกเขาสามารถตอบสนองความต้องการของคุณได้มากกว่าการทดสอบคลาส / คลาสย่อย

ดู apple doc สำหรับคลาส NSObject และโปรโตคอล:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/cl/NSObject

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

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