Obtenir le nom de la classe à partir d'une instance

142

J'ai le problème suivant: je reçois une instance d'une classe passée et je veux connaître le nom de la classe de cette instance. Comment obtenir ceci?

Robin
la source
Peut-être reformuler votre question ou accepter la réponse qui correspond à la question?
Jasper Blues
@JasperBlues: C'est fait, je n'ai même pas réalisé à quel point cela était populaire!
Robin

Réponses:

396

NSStringFromClass([instance class]) devrait faire l'affaire.

CiNN
la source
33
J'ai voté pour avoir répondu à la question afin que les googleurs puissent obtenir une réponse, au lieu d'anticiper le besoin.
Gleno
2
N'oubliez pas #import <objc/objc-runtime.h>de pouvoir appeler la classe sur une instance.
JP Illanes
28

si tout ce que vous voulez faire est de tester un objet pour voir s'il s'agit d'un type d'une certaine classe

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

De l'intérieur de la classe elle-même

-(NSString *) className
{
    return NSStringFromClass([self class]);
}
Katedral Pillon
la source
2
Je ne veux absolument pas éveiller votre colère, mais c'était la deuxième réponse liée à iOS dans votre profil. Il me semble seulement ajouter que nous pouvons désigner une instance comme "self" à partir de sa mise en œuvre. Pourriez-vous défendre cela comme un ajout substantiel à la réponse acceptée il y a trois ans?
danh le
@danh je vois que vous me traquez. Bien pour vous!
Katedral Pillon
Désolé, j'ai juste cliqué sur celui-ci et j'ai débattu de l'opportunité de dire quelque chose. Je voulais juste faire des nervures douces, mais je sais que les esprits chauffent assez rapidement dans ces environnements semi-sans visage. Merci d'être de bonne humeur à ce sujet. (En fait, +1 pour pratiquer l'encapsulation).
danh le
2
Cela n'ajoute rien à la réponse, sauf des ennuis.
Nikolai Ruhe
1
Devrait en faire une méthode de classe
Bhumit Muchhadia
2

Ajoutez simplement une catégorie:

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

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

Ensuite, utilisez le code suivant:

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

ou même:

NSString *className = SomeObject.new.className;

Pour l'utiliser n'importe où, ajoutez la catégorie au fichier YourProject.pch.

ealee
la source
Si elle est appelée sur une classe Swift, elle renvoie un nom de classe avec un espace de noms.
Alper
1

Vous pouvez aussi utiliser [[self class] description]

Jérémie D
la source
1

OBJC:

NSStringFromClass([instance class])

RAPIDE

De l'instance:

String(describing: YourType.self)

Du type:

String(describing: self)
Lal Krishna
la source
0

Si vous cherchez comment obtenir le nom de classe dans Swift, vous pouvez utiliser Reflect pour obtenir des informations sur l'objet.

let tokens = split(reflect(self).summary, { $0 == "." })
if let typeName = tokens.last {
    println(typeName)
}
Roman Barzyczak
la source
ou justeself.dynamicType
jbg