Отримання імені класу від екземпляра


142

У мене є така проблема: я отримую переданий екземпляр класу і хочу знати ім’я класу цього екземпляра. Як це отримати?


Можливо, переформулюйте своє запитання чи прийміть відповідь, що відповідає питанню?
Джаспер Блюз

@JasperBlues: Готово, навіть не усвідомлював, наскільки популярним це стало!
Робін

Відповіді:


396

NSStringFromClass([instance class]) повинен зробити трюк.


33
Запропоновано відповісти на питання, щоб гуглери могли отримати відповідь, замість того, щоб передбачати необхідність.
Глено

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 Я бачу, ти полюєш на мене. Добре вам!
Katedral Pillon

Вибачте, що я просто натиснув цей і обговорював, чи потрібно щось говорити. Просто хотілося зробити кілька ніжних ребристих, але я знаю, що в цих напівликих безтурботних умовах досить швидко нагріваються. Дякуємо за те, що добродушно ставилися до цього. (Насправді +1 для практику інкапсуляції).
дан

2
Це не додає нічого у відповідь, крім неприємностей.
Микола Рухе

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, це повертає ім'я класу в просторі імен.
Альпер


1

OBJC:

NSStringFromClass([instance class])

SWIFT

З примірника:

String(describing: YourType.self)

Від типу:

String(describing: self)

0

Якщо ви дивитесь, як отримати ім'я класу в Swift, ви можете використовувати Refleks для отримання інформації про об'єкт.

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

або простоself.dynamicType
jbg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.