Abrufen des Klassennamens von einer Instanz

141

Ich habe das folgende Problem: Ich erhalte eine Instanz einer Klasse übergeben und möchte den Namen der Klasse dieser Instanz wissen. Wie bekomme ich das?

Robin
quelle
Vielleicht Ihre Frage umformulieren oder die Antwort akzeptieren, die der Frage entspricht?
Jasper Blues
@ JasperBlues: Fertig, wusste nicht einmal, wie beliebt das wurde!
Robin

Antworten:

394

NSStringFromClass([instance class]) sollte den Trick machen.

CiNN
quelle
33
Upvoted für die Beantwortung der Frage, damit Googler eine Antwort erhalten können, anstatt die Notwendigkeit zu antizipieren.
Gleno
2
Denken Sie daran #import <objc/objc-runtime.h>, die Klasse für eine Instanz aufrufen zu können.
JP Illanes
28

Wenn Sie nur ein Objekt testen möchten, um festzustellen, ob es sich um einen Typ einer bestimmten Klasse handelt

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

Aus der Klasse heraus

-(NSString *) className
{
    return NSStringFromClass([self class]);
}
Katedral Pillon
quelle
2
Ich möchte auf keinen Fall Ihre Wut erregen, aber dies war die zweite Antwort auf iOS in Ihrem Profil. Es scheint mir nur hinzuzufügen, dass wir eine Instanz innerhalb ihrer Implementierung als "Selbst" bezeichnen können. Würden Sie dies verteidigen, um die akzeptierte Antwort des Dreijährigen wesentlich zu ergänzen?
Danh
@danh Ich sehe, du jagst mich. Schön für dich!
Katedral Pillon
Entschuldigung, ich habe gerade auf diesen geklickt und darüber diskutiert, ob ich etwas sagen soll. Ich wollte nur ein bisschen rippen, aber ich weiß, dass die Gemüter in diesen halbgesichtslosen Umgebungen ziemlich schnell heiß werden. Danke, dass du gutmütig bist. (Tatsächlich +1 zum Üben der Kapselung).
Danh
2
Dies fügt der Antwort nichts hinzu, außer Ärger.
Nikolai Ruhe
1
Sollte dies zu einer Klassenmethode machen
Bhumit Muchhadia
2

Fügen Sie einfach eine Kategorie hinzu:

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

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

Verwenden Sie dann den folgenden Code:

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

oder auch:

NSString *className = SomeObject.new.className;

Um es überall zu verwenden, fügen Sie die Kategorie zur Datei YourProject.pch hinzu.

ealee
quelle
Wenn eine Swift-Klasse aufgerufen wird, wird ein Klassenname mit Namespace zurückgegeben.
Alper
1

Sie können auch verwenden [[self class] description]

Jeremie D.
quelle
1

OBJC:

NSStringFromClass([instance class])

SCHNELL

Von der Instanz:

String(describing: YourType.self)

Vom Typ:

String(describing: self)
Lal Krishna
quelle
0

Wenn Sie suchen, wie Sie den Klassennamen in Swift erhalten, können Sie Reflect verwenden, um Informationen zum Objekt abzurufen.

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