Получение имени класса из экземпляра

143

У меня следующая проблема: я получаю экземпляр переданного класса и хочу знать имя класса этого экземпляра. Как это получить?

Робин
источник
Возможно, перефразируйте свой вопрос или примите ответ, соответствующий вопросу?
Jasper Blues
@JasperBlues: Готово, даже не осознавал, насколько это популярно!
Робин

Ответы:

398

NSStringFromClass([instance class]) должен сделать свое дело.

CiNN
источник
33
Проголосовали за ответ на вопрос, чтобы гуглеры могли получить ответ, вместо того, чтобы предвидеть необходимость.
Gleno 03
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 за практику инкапсуляции).
danh
2
Это ничего не добавляет к ответу, кроме неприятностей.
Николай Рухе
1
Должен сделать это классным методом
Бхумит Мучхадиа
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.

Ealee
источник
Если вызывается в классе Swift, он возвращает имя класса в пространстве имен.
Alper
1

Вы также можете использовать [[self class] description]

Джереми Д.
источник
1

OBJC:

NSStringFromClass([instance class])

SWIFT

Из экземпляра:

String(describing: YourType.self)

От типа:

String(describing: self)
Лал Кришна
источник
0

Если вы ищете, как получить имя класса в Swift, вы можете использовать рефлекс для получения информации об объекте.

let tokens = split(reflect(self).summary, { $0 == "." })
if let typeName = tokens.last {
    println(typeName)
}
Роман Барзичак
источник
или простоself.dynamicType
jbg 03