Abrufen des Klassennamens eines Objekts String
mit:
object_getClassName(myViewController)
gibt so etwas zurück:
_TtC5AppName22CalendarViewController
Ich suche die reine Version : "CalendarViewController"
. Wie erhalte ich stattdessen eine bereinigte Zeichenfolge des Klassennamens?
Ich habe einige Versuche gefunden, Fragen dazu zu stellen, aber keine tatsächliche Antwort. Ist das überhaupt nicht möglich?
Antworten:
Zeichenfolge aus einer Instanz :
Zeichenfolge von einem Typ :
Beispiel:
Getestet mit
class
,struct
undenum
.quelle
String(describing: MyViewController.self)
wie in den folgenden Antworten angegeben , anzurufen .Foo
,Foo2
aberFoo
anderswo eine Klasse erstelle , kann dies den Code bremsen). Im Falle einer Unterklasse müssen Sie entwedertype(of:)
oderType.self
je nach Bedarf verwenden. Ist wahrscheinlichtype(of:)
besser geeignet, um den Klassennamen zu erhalten.AKTUALISIERT AUF SWIFT 5
Über den Initialisierer können wir mithilfe der Instanzvariablen hübsche Beschreibungen von
String
Typnamen erhalten und neue Objekte einer bestimmten Klasse erstellenWie zum Beispiel
print(String(describing: type(of: object)))
. Woobject
kann eine Instanzvariable wie ein Array, ein Wörterbuch, einInt
, einNSDate
usw. sein?Da dies
NSObject
die Stammklasse der meisten Objective-C-Klassenhierarchien ist, können Sie versuchen, eine Erweiterung fürNSObject
zu erstellen, um den Klassennamen jeder Unterklasse von zu erhaltenNSObject
. So was:Oder Sie können eine statische Funktion erstellen, deren Parameter vom Typ ist
Any
(das Protokoll, dem alle Typen implizit entsprechen) und den Klassennamen als String zurückgibt. So was:Jetzt können Sie so etwas tun:
Sobald wir den Klassennamen als String erhalten, können wir auch neue Objekte dieser Klasse instanziieren :
Vielleicht hilft das jemandem da draußen!.
quelle
classNameAsString
kann vereinfacht werdenclassName
, denn dieser "Name" impliziert seinen Typ.theClassName
ähnelt der Geschichte von Facebook, die ursprünglich den Namen Facebook trägt.ProjectTest.MyViewController
. H. Wie werde ich diesen Projektnamen los? Ich möchte nur den Klassennamen.Swift 5
Hier ist die Erweiterung, um die
typeName
als Variable abzurufen (arbeiten Sie sowohl mit dem Werttyp als auch mit dem Referenztyp).Wie benutzt man:
quelle
Swift 3.0
String(describing: MyViewController.self)
quelle
type(of: )
ist da ein Overkill,String(describing: MyViewController.self)
wird ausreichenString.init(describing: MyViewController.self)
?init
ist unnötig.Ich schlage einen solchen Ansatz vor ( sehr schnell ):
Es wird weder Selbstbeobachtung noch manuelles Entwirren verwendet ( keine Magie! ).
Hier ist eine Demo:
quelle
type(of: self)
Wenn Sie einen Typ haben
Foo
, erhalten Sie den folgenden Code"Foo"
in Swift 3 und Swift 4:Das Problem mit den meisten Antworten hier ist, dass sie Ihnen
"Foo.Type"
als resultierende Zeichenfolge geben, wenn Sie keine Instanz des Typs haben, wenn das, was Sie wirklich wollen, gerecht ist"Foo"
. Im Folgenden finden Sie"Foo.Type"
, wie in einigen anderen Antworten erwähnt.Das
type(of:)
Teil ist unnötig, wenn Sie nur wollen"Foo"
.quelle
In Swift 4.1 und jetzt in Swift 4.2 :
Wenn Sie keine Instanz haben:
Wenn Sie eine Instanz haben:
quelle
Um den Namen einer Swift-Klasse von einem Objekt abzurufen, z. B. für das var-Objekt: SomeClass (), verwenden Sie
Verwenden Sie Folgendes, um den Namen einer Swift-Klasse von einem Klassentyp abzurufen, z. B. SomeClass.
Ausgabe:
quelle
Sie können dies folgendermaßen versuchen:
quelle
Sie können die Swift-Standardbibliotheksfunktion
_stdlib_getDemangledTypeName
wie folgt verwenden:quelle
Verwenden Sie einfach die Zeichenfolgeninterpolation, um den Typnamen als Zeichenfolge in Swift 4 abzurufen (ich habe die früheren Versionen nicht überprüft):
Sie können
.self
für einen Typ selbst und dietype(of:_)
Funktion für eine Instanz verwenden:quelle
Man kann auch Spiegel verwenden:
NB: Diese Methode kann auch für Strukturen und Aufzählungen verwendet werden. Es gibt einen displayStyle, der angibt, welcher Typ der Struktur:
Die Rückgabe ist eine Aufzählung, so dass Sie:
quelle
Swift 5.1
Sie können jedoch Klassen-, Struktur-, Aufzählungs-, Protokoll- und NSObject-Namen abrufen
Self.self
.quelle
String(describing: type(of: self))
Swift 3.0: Sie können eine Erweiterung wie diese erstellen. Sie gibt den Klassennamen ohne den Projektnamen zurück
quelle
Sie können
NSObjectProtocol
in Swift 4 folgendermaßen erweitern:Dadurch wird die berechnete Variable
className
ALLEN Klassen zur Verfügung gestellt. Wenn Sie dies in einemprint()
In verwenden,CalendarViewController
wird"CalendarViewController"
in der Konsole gedruckt .quelle
Ich habe eine Weile nach dieser Antwort gesucht. Ich benutze GKStateMachine und beobachte gerne Statusänderungen und wollte eine einfache Möglichkeit, nur den Klassennamen zu sehen. Ich bin nicht sicher, ob es nur iOS 10 oder Swift 2.3 ist, aber in dieser Umgebung macht das Folgende genau das, was ich will:
quelle
Sie können den Namen der Klasse erhalten, indem Sie Folgendes tun:
quelle
Um den Klassennamen als String zu erhalten, deklarieren Sie Ihre Klasse wie folgt
Und erhalten Sie den Klassennamen mit der folgenden Syntax
quelle
Probieren Sie
reflect().summary
Class self oder instance dynamicType aus. Entpacken Sie die Optionen, bevor Sie dynamicType abrufen. Andernfalls ist der dynamicType der optionale Wrapper.Die Zusammenfassung ist ein Klassenpfad mit beschriebenen generischen Typen. Versuchen Sie diese Methode, um einen einfachen Klassennamen aus der Zusammenfassung zu erhalten.
quelle
Die oben genannten Lösungen haben bei mir nicht funktioniert. Das produzierte meistens die Themen, die in mehreren Kommentaren erwähnt werden:
oder
Diese Lösung funktionierte mit XCode 9, Swift 3.0:
Ich habe es
classNameCleaned
so benannt, dass der Zugriff einfacher ist und keine Konflikte mit zukünftigenclassName()
Änderungen auftreten:}}
Verwendungszweck:
quelle
Swift 3.0 (macOS 10.10 und höher) können Sie von className erhalten
quelle
NSObject
developer.apple.com/reference/objectivec/nsobject/… handeltSwift 5
quelle
Diese Art von Beispiel für die Klasse var. Geben Sie nicht den Namen des Bundles an.
quelle
Wenn Ihnen der verstümmelte Name nicht gefällt, können Sie Ihren eigenen Namen diktieren:
Auf lange Sicht wäre es jedoch besser zu lernen, den verstümmelten Namen zu analysieren. Das Format ist Standard und aussagekräftig und ändert sich nicht.
quelle
Manchmal geben die anderen Lösungen einen nicht nützlichen Namen, je nachdem, welches Objekt Sie betrachten möchten. In diesem Fall können Sie den Klassennamen wie folgt als Zeichenfolge abrufen.
⌘ Klicken Sie auf die Funktion in xcode, um einige verwandte Methoden anzuzeigen, die ziemlich nützlich sind. oder überprüfen Sie hier https://developer.apple.com/reference/objectivec/objective_c_functions
quelle
Ich habe es
type(of:...)
mit Swift 3 auf dem Spielplatz versucht . Dies ist mein Ergebnis. Dies ist die Version im Codeformat.quelle
Swift 5 Sie können class_name als String mit String erhalten (Beschreibung: Self.self)
quelle
Ich benutze es in Swift 2.2
quelle
Swift 5.1: -
Sie können auch die generische Funktion verwenden, um den Klassennamen des Objekts als Zeichenfolge abzurufen
Rufen Sie diese Funktion wie folgt auf: -
Viel Spaß beim Codieren :)
quelle
In meinem Fall hat String (beschreibend: self) etwas zurückgegeben wie:
Aber ich hätte gerne so etwas wie
getSimpleName
auf Android.Also habe ich eine kleine Erweiterung erstellt:
Und jetzt kehrt es zurück:
Das Erweitern von NSObject anstelle von UIViewController sollte ebenfalls funktionieren. Die obige Funktion ist auch ausfallsicher :)
quelle