ใน Objective-C อะไรคือสิ่งที่เทียบเท่ากับคำหลัก "instanceof" ของ Java?


185

ฉันต้องการตรวจสอบว่าวัตถุ (เช่นsomeObject) สามารถกำหนดได้ (cast-can) ให้กับตัวแปรประเภทอื่น (เช่นSpecifiedType) ใน Java ฉันสามารถเขียน:

someObject instanceof SpecifiedType

คำถามที่เกี่ยวข้องคือการค้นหาว่าประเภทรันไทม์ของวัตถุนั้นเท่ากับประเภทอื่นหรือไม่ ใน Java ฉันสามารถเขียน:

someObject.getClass().equals(SpecifiedType.class)

สิ่งนี้สามารถทำได้ใน Objective-C


ดูเพิ่มเติมที่: stackoverflow.com/q/8294076/165674
Dheeraj Vepakomma

คำตอบ:


264

ลอง[myObject class]คืนคลาสของวัตถุ

คุณสามารถทำการเปรียบเทียบที่แน่นอนด้วย:

if ([myObject class] == [MyClass class])

แต่ไม่ใช่โดยใช้MyClassตัวระบุโดยตรง

ในทำนองเดียวกันคุณสามารถค้นหาว่าวัตถุนั้นเป็นคลาสย่อยของคลาสของคุณด้วย:

if ([myObject isKindOfClass:[AnObject class]])

ตามที่ Jon Skeet และ zoul แนะนำ


ฉันจะตรวจสอบความเท่าเทียมกันกับวัตถุประเภท "AnObject" ได้อย่างไร
Dimitris

"if ([myObject class] == [AnObject class])" หรือตามที่ Jon Skeet และ zoul แนะนำ: "if ([myObject isKindOfClass: [AnObject class]]
mouviciel

8
การเปรียบเทียบที่แน่นอนสามารถทำได้ด้วยif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

จากWikipedia :

ใน Objective-C ตัวอย่างเช่นทั้ง generic ObjectและNSObject(ใน Cocoa / OpenStep) จัดเตรียมเมธอด isMemberOfClass:ซึ่งส่งคืนtrueหากอาร์กิวเมนต์ของเมธอดเป็นตัวอย่างของคลาสที่ระบุ วิธีการisKindOfClass:ส่งกลับแบบอะนาล็อกจริงถ้าอาร์กิวเมนต์สืบทอดจากคลาสที่ระบุ

isKindOfClass:จะใกล้เคียงที่สุดinstanceofโดยเสียงของมัน


9

ดูวิธีisKindOfClass:ในเอกสารประกอบNSObject (คำเตือนปกติสำหรับคำถามดังกล่าวคือการตรวจสอบคลาสวัตถุมักเป็นสัญญาณของการทำสิ่งผิดปกติ)


2
เพียงคัดลอกจาก "คำตอบ" ด้านล่าง: "@ Zoul - ทำไมการตรวจสอบประเภทชั้นเรียนถึงถือว่าไม่ดีใช่ไหมนี่ไม่ใช่การเขียนโปรแกรมการป้องกันที่ดีหรือคุณกำลังเถียงว่ามันไม่จำเป็นเลยเหรอ?"
Dan Rosenstark

1
อ้าขอบคุณ ปัญหาหนึ่งคือวัตถุไม่จำเป็นต้องอยู่ในคลาสที่คุณคาดหวัง ในระหว่างการทดสอบเป็นเรื่องธรรมดาที่จะส่งคลาสสตับที่ให้เกียรติอินเทอร์เฟซ แต่มีคลาสอื่น หรือเมื่อคุณสังเกตการเปลี่ยนแปลงค่าโดยใช้ KVO มีเวทมนตร์บางอย่างที่ทำกับคลาส ทั้งสองกรณีนั้นค่อนข้างถูกต้องและทั้งคู่ก็จะแตกง่ายถ้ารหัสของคุณทำการตรวจสอบคลาสอย่างชัดเจน พฤติกรรมการสลับกับคลาสเป็นการออกแบบ OO ที่ไม่ดีมีการเชื่อมต่ออย่างแน่นหนาและขยายได้ยาก ฉันไม่ได้บอกว่าไม่มีกรณีใช้ที่ถูกต้องสำหรับการตรวจสอบในชั้นเรียน แต่คุณควรคิดสองครั้งก่อนที่จะทำ
zoul

@zoul + (BOOL)conformsToProtocol:(Protocol *)aProtocolในกรณีที่เฉพาะเจาะจงที่ว่านี้จะขาดประสบการณ์เพียงธรรมดาคนหนึ่งจะใช้โอกาสมากขึ้น
EricLeaf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.