Obtener el nombre de la clase de una instancia

142

Tengo el siguiente problema: me pasa una instancia de una clase y quiero saber el nombre de la clase de esta instancia. ¿Cómo conseguir esto?

Robin
fuente
¿Quizás reformule su pregunta o acepte la respuesta que coincide con la pregunta?
Jasper Blues
@JasperBlues: Hecho, ¡ni siquiera me di cuenta de cuán popular se volvió esto!
Robin

Respuestas:

396

NSStringFromClass([instance class]) debería hacer el truco.

CiNN
fuente
33
Votado por responder la pregunta para que los googlers puedan obtener una respuesta, en lugar de anticipar la necesidad.
Gleno
2
Recuerde #import <objc/objc-runtime.h>poder llamar a la clase en una instancia.
JP Illanes
28

si todo lo que quieres hacer es probar un objeto para ver si es un tipo de cierta clase

BOOL test = [self isKindOfClass:[SomeClass class]];
kubi
fuente
18

Desde dentro de la clase misma

-(NSString *) className
{
    return NSStringFromClass([self class]);
}
Katedral Pillon
fuente
2
Absolutamente no quiero despertar tu ira, pero esta fue la segunda respuesta relacionada con iOS en tu perfil. Me parece agregar solo que podemos referirnos a una instancia como "self" desde su implementación. ¿Defenderías esto como una adición sustancial a la respuesta aceptada de tres años?
danh
@danh, veo que me estás persiguiendo. ¡Bien por usted!
Katedral Pillon
Lo siento, acabo de hacer clic en este y debatí si decir algo. Solo quería hacer un poco de costillas suaves, pero sé que los ánimos se calientan bastante rápido en estos entornos sin rostro. Gracias por ser bondadoso al respecto. (De hecho, +1 para practicar la encapsulación).
danh
2
Esto no agrega nada a la respuesta, excepto problemas.
Nikolai Ruhe
1
En caso de que este método de una clase
Bhumit Muchhadia
2

Solo agrega una categoría:

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

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

Luego use el siguiente código:

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

o incluso:

NSString *className = SomeObject.new.className;

Para usarlo en cualquier lugar, agregue la categoría al archivo YourProject.pch.

ealee
fuente
Si se llama en una clase Swift, esto devuelve un nombre de clase con espacio de nombres.
Alper
1

También puedes usar [[self class] description]

Jeremie D
fuente
1

OBJC:

NSStringFromClass([instance class])

RÁPIDO

De instancia:

String(describing: YourType.self)

De tipo:

String(describing: self)
Lal Krishna
fuente
0

Si está buscando cómo obtener classname en Swift, puede usar reflect para obtener información sobre el objeto.

let tokens = split(reflect(self).summary, { $0 == "." })
if let typeName = tokens.last {
    println(typeName)
}
Roman Barzyczak
fuente
o simplementeself.dynamicType
jbg