Gibt es eine Möglichkeit, den Laufzeittyp einer Variablen schnell zu drucken? Zum Beispiel:
var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)
println("\(now.dynamicType)")
// Prints "(Metatype)"
println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector
println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method
Im obigen Beispiel suche ich nach einer Möglichkeit, um zu zeigen, dass die Variable "bald" vom Typ ist ImplicitlyUnwrappedOptional<NSDate>
, oder zumindest NSDate!
.
Antworten:
Update September 2016
Swift 3.0: Verwenden Sie
type(of:)
z. B.type(of: someThing)
(da dasdynamicType
Schlüsselwort entfernt wurde)Update Oktober 2015 :
Ich habe die folgenden Beispiele auf die neue Swift 2.0-Syntax aktualisiert (zB
println
wurde durch ersetztprint
,toString()
ist jetztString()
).Aus den Versionshinweisen zu Xcode 6.3 :
@nschum weist in den Kommentaren darauf hin, dass die Xcode 6.3- Versionshinweise einen anderen Weg zeigen:
Welche Ausgänge:
Update für Xcode 6.3:
Sie können Folgendes verwenden
_stdlib_getDemangledTypeName()
:und erhalten Sie dies als Ausgabe:
Ursprüngliche Antwort:
Vor Xcode 6.3
_stdlib_getTypeName
wurde der verstümmelte Typname einer Variablen abgerufen. Der Blogeintrag von Ewan Swick hilft dabei, diese Zeichenfolgen zu entschlüsseln:zB
_TtSi
steht für Swifts internenInt
Typ.Mike Ash hat einen großartigen Blogeintrag zum gleichen Thema .
quelle
_stdlib_getTypeName()
? Die integrierte REPL existiert nicht mehr, existiertswift-ide-test
auch nicht, und Xcodes Druck des Swift-Moduls entfernt_
vorfixierte Werte.lldb
leicht genug in der Antwort suchen. Es gibt auch_stdlib_getDemangledTypeName()
und_stdlib_demangleName()
.image
es eine Abkürzung für isttarget modules
.target modules lookup -r -n _stdlib_
image lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
Schlüsselwort wurde aus Swift entfernt. An seiner Stelle wurdetype(of:)
der Sprache eine neue primitive Funktion hinzugefügt: github.com/apple/swift/blob/master/CHANGELOG.mdBearbeiten: In Swift 1.2 (Xcode 6.3) wurde eine neue
toString
Funktion eingeführt .Sie können jetzt den entwirrten Typ eines beliebigen Typs mit
.self
und einer beliebigen Instanz drucken mit.dynamicType
:Versuchen Sie anzurufen
YourClass.self
undyourObject.dynamicType
.Referenz: https://devforums.apple.com/thread/227425 .
quelle
someInstance.dynamicType.printClassName()
druckt den Namen der Klasse.Swift 3.0
quelle
Ist es das, wonach du suchst?
Es wird "__NSDate" gedruckt.
UPDATE : Bitte beachten Sie, dass dies ab Beta05 nicht mehr zu funktionieren scheint
quelle
Mein aktueller Xcode ist Version 6.0 (6A280e).
Ausgabe:
quelle
Optional(...)
, sodass Ihr Code nurOptional
als Typ zurückgegeben wird. Es sollte auchvar optionalTestVar: Person? = Person(name:"Sarah")
als Optional (Person) und var mit Person angezeigt werden! als ImplicitlyUnwrappedOptional (Person)Ab Xcode 6.3 mit Swift 1.2 können Sie einfach Typwerte in vollständig entwirrte konvertieren
String
.quelle
Sie können weiterhin über
className
(was a zurückgibtString
) auf die Klasse zugreifen .Es gibt tatsächlich mehr Möglichkeiten , um die Klasse, zum Beispiel zu bekommen
classForArchiver
,classForCoder
,classForKeyedArchiver
(alle zurückAnyClass!
).Sie können den Typ eines Grundelements nicht ermitteln (ein Grundelement ist keine Klasse).
Beispiel:
Wenn Sie den Typ eines Grundelements erhalten möchten, müssen Sie verwenden
bridgeToObjectiveC()
. Beispiel:quelle
import Cocoa
.className
ist Teil der AppleScript-Unterstützung von Cocoa und sollte auf keinen Fall für die allgemeine Selbstbeobachtung verwendet werden. Offensichtlich ist es unter iOS nicht verfügbar.Sie können Reflect verwenden, um Informationen zum Objekt abzurufen.
Zum Beispiel Name der Objektklasse:
quelle
reflect(x).summary
- danke!Ich hatte Glück mit:
quelle
Xcode 8 Swift 3.0 verwendet Typ (von :)
quelle
In Xcode 8 Swift 3.0
Schritte:
1. Holen Sie sich den Typ:
Option 1:
Option 2:
2. Typ in String konvertieren:
quelle
In Swift 3.0 können Sie verwenden
type(of:)
, da dasdynamicType
Schlüsselwort entfernt wurde.quelle
SWIFT 5
Mit der neuesten Version von Swift 3 können wir über den
String
Initialisierer hübsche Beschreibungen von Typnamen erhalten. Wie zum Beispielprint(String(describing: type(of: object)))
. Woobject
kann eine Instanzvariable wie ein Array, ein Wörterbuch, eineInt
, eineNSDate
, eine Instanz einer benutzerdefinierten Klasse usw. sein?Hier ist meine vollständige Antwort: Holen Sie sich den Klassennamen des Objekts als Zeichenfolge in Swift
Diese Frage sucht nach einer Möglichkeit, den Klassennamen eines Objekts als Zeichenfolge abzurufen, aber ich schlug auch eine andere Möglichkeit vor, den Klassennamen einer Variablen abzurufen, die keine Unterklasse von ist
NSObject
. Hier ist es:Ich habe eine statische Funktion erstellt, die als Parameter ein Objekt vom Typ verwendet
Any
und dessen Klassennamen als zurückgibtString
:) .Ich habe diese Funktion mit einigen Variablen getestet wie:
und die Ausgabe war:
quelle
Wenn Sie Cocoa (nicht CocoaTouch) verwenden, können Sie das verwenden
className
Eigenschaft für Objekte verwenden, die Unterklassen von NSObject sind.Diese Eigenschaft ist nicht für normale Swift-Objekte verfügbar, die keine Unterklassen von NSObject sind (und tatsächlich gibt es in Swift keine Stamm-ID oder keinen Objekttyp).
In CocoaTouch gibt es derzeit keine Möglichkeit, eine Zeichenfolgenbeschreibung des Typs einer bestimmten Variablen abzurufen. Eine ähnliche Funktionalität gibt es auch für primitive Typen in Cocoa oder CocoaTouch nicht.
Die Swift REPL kann eine Zusammenfassung der Werte einschließlich ihres Typs ausdrucken, sodass diese Art der Selbstbeobachtung möglicherweise in Zukunft über eine API möglich sein wird.
EDIT :
dump(object)
scheint den Trick zu tun.quelle
dump(object)
ist es wirklich mächtig. Vielen Dank.Die Top-Antwort enthält kein funktionierendes Beispiel für die neue Vorgehensweise
type(of:
. Um Anfängern wie mir zu helfen, finden Sie hier ein funktionierendes Beispiel, das hauptsächlich aus Apples Dokumenten hier stammt - https://developer.apple.com/documentation/swift/2885064-typequelle
Ich habe einige der anderen Antworten hier ausprobiert, aber die Laufleistung scheint sehr darauf zu beruhen, was das untergeordnete Objekt ist.
Ich habe jedoch einen Weg gefunden, wie Sie den Object-C-Klassennamen für ein Objekt erhalten können, indem Sie Folgendes tun:
Hier ist ein Beispiel, wie Sie es verwenden würden:
In diesem Fall wird NSDate in der Konsole gedruckt.
quelle
Ich habe diese Lösung gefunden, die hoffentlich für jemand anderen funktioniert. Ich habe eine Klassenmethode erstellt, um auf den Wert zuzugreifen. Bitte beachten Sie, dass dies nur für die NSObject-Unterklasse funktioniert. Aber zumindest ist eine saubere und ordentliche Lösung.
quelle
Im neuesten XCode 6.3 mit Swift 1.2 ist dies der einzige Weg, den ich gefunden habe:
quelle
<swift module name>.<actual class name>
, sodass Sie die Zeichenfolge mit a teilen.
und das letzte Token erhalten möchten .Viele der Antworten hier funktionieren nicht mit dem neuesten Swift (Xcode 7.1.1 zum Zeitpunkt des Schreibens).
Der aktuelle Weg, um die Informationen zu erhalten, besteht darin, eine zu erstellen
Mirror
und diese abzufragen. Für den Klassennamen ist es so einfach wie:Zusätzliche Informationen zum Objekt können auch aus dem abgerufen werden
Mirror
. Weitere Informationen finden Sie unter http://swiftdoc.org/v2.1/type/Mirror/ .quelle
In lldb ab Beta 5 können Sie die Klasse eines Objekts mit dem folgenden Befehl anzeigen:
welches etwas ausgibt wie:
Der erweiterte Befehl bedeutet ungefähr:
Frame Variable
(eine Rahmenvariable drucken)-d run_target
(dynamische Typen erweitern)Es ist nützlich zu wissen, dass die Verwendung von "Frame Variable" zur Ausgabe von Variablenwerten garantiert, dass kein Code ausgeführt wird.
quelle
Ich habe eine Lösung für selbst entwickelte Klassen gefunden (oder solche, auf die Sie Zugriff haben).
Platzieren Sie die folgende berechnete Eigenschaft in Ihrer Objektklassendefinition:
Jetzt können Sie einfach den Klassennamen für Ihr Objekt wie folgt aufrufen:
Bitte beachten Sie, dass dies nur funktioniert, wenn Ihre Klassendefinition in einer Datei erstellt wird, deren Name genau der Klasse entspricht, deren Namen Sie möchten.
Da dies üblicherweise der Fall ist, sollte die obige Antwort dies in den meisten Fällen tun . In einigen besonderen Fällen müssen Sie möglicherweise eine andere Lösung finden.
Wenn Sie den Klassennamen in der Klasse (Datei) selbst benötigen , können Sie einfach diese Zeile verwenden:
Vielleicht hilft diese Methode einigen Leuten da draußen.
quelle
Basierend auf den Antworten und Kommentaren von Klass und Kevin Ballard würde ich gehen mit:
welches ausgedruckt wird:
quelle
toString(self.dynamicType).componentsSeparatedByString(".").last!
Offensichtlich befand ich mich in einem Objektkontext und konnte referenzierenself
.quelle
Schnelle Version 4:
Danke @Joshua Dance
quelle
Swift 4:
Verwendungszweck:
quelle
Es scheint keine generische Möglichkeit zu geben, den Typnamen eines beliebigen Werttyps zu drucken. Wie andere angemerkt haben, können Sie für Klasseninstanzen drucken
value.className
aber für primitive Werte scheint es, dass zur Laufzeit die Typinformationen weg sind.Zum Beispiel sieht es so aus, als gäbe es keine Möglichkeit zu tippen:
1.something()
undInt
für einen Wert von rauszukommensomething
. (Sie können, wie eine andere Antwort vorgeschlagen, verwendeni.bridgeToObjectiveC().className
Sie einen Hinweis geben, aber__NSCFNumber
ist nicht wirklich die Art voni
-. Genau das, was es zu konvertierenden wird , wenn er überquert die Grenze eines Objective-C - Funktionsaufruf)Ich würde mich freuen, wenn ich mich als falsch erweisen würde, aber es sieht so aus, als ob die Typprüfung alle zur Kompilierungszeit durchgeführt wird und wie bei C ++ (mit deaktiviertem RTTI) sind viele der Typinformationen zur Laufzeit verschwunden.
quelle
Auf diese Weise erhalten Sie eine Typzeichenfolge Ihres Objekts oder Typs, die konsistent ist und berücksichtigt, zu welchem Modul die Objektdefinition gehört oder in dem sie verschachtelt ist. Funktioniert in Swift 4.x.
quelle
Um einen Objekttyp oder eine Objektklasse in Swift abzurufen , müssen Sie einen Typ (von: yourObject) verwenden.
Typ (von: yourObject)
quelle
Nicht genau das, wonach Sie suchen, aber Sie können den Typ der Variablen auch anhand der folgenden Swift-Typen überprüfen:
Zum Beispiel.
quelle
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
quelle