รับชื่อคลาสจากอินสแตนซ์


142

ฉันมีปัญหาดังต่อไปนี้: ฉันได้รับอินสแตนซ์ของคลาสที่ผ่านและต้องการทราบชื่อของคลาสของอินสแตนซ์นี้ จะได้รับสิ่งนี้ได้อย่างไร


อาจตั้งคำถามใหม่ของคุณหรือยอมรับคำตอบที่ตรงกับคำถาม
Jasper Blues

@JasperBlues: เสร็จแล้วไม่ได้ตระหนักเลยว่ามันได้รับความนิยมขนาดไหน!
Robin

คำตอบ:


396

NSStringFromClass([instance class]) ควรทำเคล็ดลับ


33
โหวตขึ้นเพื่อตอบคำถามเพื่อให้ชาว Google ได้รับคำตอบแทนที่จะคาดการณ์ความต้องการ
Gleno

2
จำไว้ว่าให้#import <objc/objc-runtime.h>สามารถเรียกคลาสในอินสแตนซ์
JP Illanes

28

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

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

18

จากภายในห้องเรียนนั่นเอง

-(NSString *) className
{
    return NSStringFromClass([self class]);
}

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

@danh ฉันเห็นคุณกำลังตามล่าฉันลง ดีสำหรับคุณ!
Katedral Pillon

ขออภัยฉันเพิ่งคลิกอันนี้และถกเถียงกันว่าจะพูดอะไรหรือไม่ แค่อยากทำซี่โครงนุ่ม ๆ แต่ฉันรู้ว่าอารมณ์ร้อนขึ้นอย่างรวดเร็วในการตั้งค่ากึ่งไร้ใบหน้าเหล่านี้ ขอบคุณที่เป็นคนนิสัยดี (อันที่จริง +1 สำหรับการฝึก encapsulation)
danh

2
สิ่งนี้จะไม่เพิ่มอะไรให้กับคำตอบยกเว้นปัญหา
Nikolai Ruhe

1
ควรทำให้เป็นวิธีการเรียน
Bhumit Muchhadia

2

เพียงเพิ่มหมวดหมู่:

NSObject+Extensions.h
- (NSString *)className;

NSObject+Extensions.m
- (NSString *)className {
    return NSStringFromClass(self.class);
}

จากนั้นใช้รหัสต่อไปนี้:

NSString *className = [[SomeObject new] className];

หรือแม้กระทั่ง:

NSString *className = SomeObject.new.className;

หากต้องการใช้ที่ใดก็ได้ให้เพิ่มหมวดหมู่ไปยังไฟล์ YourProject.pch


ถ้าเรียกในคลาส Swift จะส่งคืนชื่อคลาสเนมสเปซ
Alper



0

หากคุณกำลังมองหาวิธีรับชื่อ class ใน Swift คุณสามารถใช้ reflect เพื่อรับข้อมูลเกี่ยวกับวัตถุ

let tokens = split(reflect(self).summary, { $0 == "." })
if let typeName = tokens.last {
    println(typeName)
}

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