Existe-t-il un moyen d'imprimer le type d'exécution d'une variable dans Swift? Par exemple:
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
Dans l'exemple ci-dessus, je cherche un moyen de montrer que la variable "bientôt" est de type ImplicitlyUnwrappedOptional<NSDate>
, ou du moins NSDate!
.
Réponses:
Mise à jour de septembre 2016
Swift 3.0: Utiliser
type(of:)
, par exempletype(of: someThing)
(puisque ledynamicType
mot - clé a été supprimé)Mise à jour d'octobre 2015 :
J'ai mis à jour les exemples ci-dessous pour la nouvelle syntaxe Swift 2.0 (par exemple, a
println
été remplacé parprint
,toString()
est maintenantString()
).À partir des notes de publication de Xcode 6.3 :
@nschum souligne dans les commentaires que les notes de publication de Xcode 6.3 montrent une autre manière:
Quelles sorties:
Mise à jour pour Xcode 6.3:
Vous pouvez utiliser
_stdlib_getDemangledTypeName()
:et obtenez ceci en sortie:
Réponse originale:
Avant Xcode 6.3
_stdlib_getTypeName
, le nom de type modifié d'une variable était obtenu. L'entrée de blog d'Ewan Swick permet de déchiffrer ces chaînes:par exemple,
_TtSi
représente leInt
type interne de Swift .Mike Ash a une excellente entrée de blog couvrant le même sujet .
la source
_stdlib_getTypeName()
? Le REPL intégré n'existe plus,swift-ide-test
n'existe pas non plus, et l'impression par Xcode du module Swift_
élude les valeurs préfixées.lldb
assez facilement dans la réplique. Il y a aussi_stdlib_getDemangledTypeName()
, et_stdlib_demangleName()
.image
c'était un raccourcitarget modules
. J'ai fini par utilisertarget modules lookup -r -n _stdlib_
, ce qui bien sûr est mieux exprimé commeimage lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
mot clé a été supprimé de Swift. A sa place, une nouvelle fonction primitivetype(of:)
a été ajoutée au langage: github.com/apple/swift/blob/master/CHANGELOG.mdEdit: Une nouvelle
toString
fonction a été introduite dans Swift 1.2 (Xcode 6.3) .Vous pouvez maintenant imprimer le type démangé de n'importe quel type à l'aide de
.self
et n'importe quelle instance à l'aide de.dynamicType
:Essayez d'appeler
YourClass.self
etyourObject.dynamicType
.Référence: https://devforums.apple.com/thread/227425 .
la source
someInstance.dynamicType.printClassName()
affichera le nom de la classe.Swift 3.0
la source
C'est ce que vous cherchez?
Il imprime "__NSDate"
MISE À JOUR : Veuillez noter que cela ne semble plus fonctionner à partir de Beta05
la source
Mon Xcode actuel est la version 6.0 (6A280e).
Production:
la source
Optional(...)
, donc votre code ne retourneraitOptional
que comme type. Il doit également s'affichervar optionalTestVar: Person? = Person(name:"Sarah")
comme facultatif (personne) et var avec personne! as ImplicitlyUnwrappedOptional (Person)À partir de Xcode 6.3 avec Swift 1.2, vous pouvez simplement convertir les valeurs de type en démanglé complet
String
.la source
Vous pouvez toujours accéder à la classe via
className
(qui renvoie aString
).Il y a en fait plusieurs façons d'obtenir la classe, par exemple
classForArchiver
,classForCoder
,classForKeyedArchiver
(tout retourAnyClass!
).Vous ne pouvez pas obtenir le type d'une primitive (une primitive n'est pas une classe).
Exemple:
Si vous voulez obtenir le type d'une primitive, vous devez utiliser
bridgeToObjectiveC()
. Exemple:la source
import Cocoa
.className
fait partie du support AppleScript de Cocoa et ne doit certainement pas être utilisé pour une introspection générique. Évidemment, il n'est pas disponible sur iOS.Vous pouvez utiliser la réflexion pour obtenir des informations sur l'objet.
Par exemple, le nom de la classe d'objets:
la source
reflect(x).summary
- merci!J'ai eu de la chance avec:
la source
Type d'utilisation de Xcode 8 Swift 3.0 (of :)
la source
Dans Xcode 8, Swift 3.0
Pas:
1. Obtenez le type:
Option 1:
Option 2:
2. Convertissez le type en chaîne:
la source
Dans Swift 3.0, vous pouvez utiliser
type(of:)
, car ledynamicType
mot-clé a été supprimé.la source
SWIFT 5
Avec la dernière version de Swift 3, nous pouvons obtenir de jolies descriptions des noms de type via l'
String
initialiseur. Comme, par exempleprint(String(describing: type(of: object)))
. Oùobject
peut être une variable d'instance comme un tableau, un dictionnaire, unInt
, unNSDate
, une instance d'une classe personnalisée, etc.Voici ma réponse complète: obtenir le nom de classe de l'objet sous forme de chaîne dans Swift
Cette question cherche un moyen d'obtenir le nom de classe d'un objet sous forme de chaîne, mais j'ai également proposé un autre moyen d'obtenir le nom de classe d'une variable qui n'est pas une sous-classe de
NSObject
. C'est ici:J'ai fait une fonction statique qui prend en paramètre un objet de type
Any
et retourne son nom de classe commeString
:).J'ai testé cette fonction avec quelques variables comme:
et la sortie était:
la source
Lorsque vous utilisez Cocoa (et non CocoaTouch), vous pouvez utiliser la
className
propriété pour les objets qui sont des sous-classes de NSObject.Cette propriété n'est pas disponible pour les objets Swift normaux, qui ne sont pas des sous-classes de NSObject (et en fait, il n'y a pas d'ID racine ou de type d'objet dans Swift).
Dans CocoaTouch, pour le moment, il n'existe aucun moyen d'obtenir une description de chaîne du type d'une variable donnée. Des fonctionnalités similaires n'existent pas non plus pour les types primitifs dans Cocoa ou CocoaTouch.
Le Swift REPL est capable d'imprimer un résumé des valeurs, y compris son type, il est donc possible que cette manière d'introspection soit possible via une API à l'avenir.
EDIT :
dump(object)
semble faire l'affaire.la source
dump(object)
est vraiment puissant. Je vous remercie.La première réponse n'a pas d'exemple de travail de la nouvelle façon de procéder en utilisant
type(of:
. Donc, pour aider les débutants comme moi, voici un exemple de travail, tiré principalement des documents d'Apple ici - https://developer.apple.com/documentation/swift/2885064-typela source
J'ai essayé certaines des autres réponses ici, mais le kilométrage semble très bien sur ce qu'est l'objet sous-jacent.
Cependant, j'ai trouvé un moyen d'obtenir le nom de classe Object-C d'un objet en procédant comme suit:
Voici un exemple d'utilisation que vous en feriez:
Dans ce cas, il imprimera NSDate dans la console.
la source
J'ai trouvé cette solution qui, je l'espère, pourrait fonctionner pour quelqu'un d'autre. J'ai créé une méthode de classe pour accéder à la valeur. Veuillez garder à l'esprit que cela ne fonctionnera que pour la sous-classe NSObject. Mais au moins, c'est une solution propre et bien rangée.
la source
Dans le dernier XCode 6.3 avec Swift 1.2, c'est le seul moyen que j'ai trouvé:
la source
<swift module name>.<actual class name>
, vous voulez donc diviser la chaîne avec a.
et obtenir le dernier jeton.Beaucoup de réponses ici ne fonctionnent pas avec la dernière Swift (Xcode 7.1.1 au moment de la rédaction).
La manière actuelle d'obtenir les informations est de créer
Mirror
et d'interroger cela. Pour le nom de classe, c'est aussi simple que:Des informations supplémentaires sur l'objet peuvent également être récupérées à partir du
Mirror
. Voir http://swiftdoc.org/v2.1/type/Mirror/ pour plus de détails.la source
Dans lldb à partir de la bêta 5, vous pouvez voir la classe d'un objet avec la commande:
qui génère quelque chose comme:
La commande développée signifie quelque chose comme:
Frame Variable
(imprimer une variable de cadre)-d run_target
(développer les types dynamiques)Il est utile de savoir que l'utilisation de "Frame Variable" pour générer des valeurs de variable garantit qu'aucun code n'est exécuté.
la source
J'ai trouvé une solution pour les classes auto-développées (ou celles auxquelles vous avez accès).
Placez la propriété calculée suivante dans votre définition de classe d'objets:
Maintenant, vous pouvez simplement appeler le nom de la classe sur votre objet comme ceci:
Veuillez noter que cela ne fonctionnera que si votre définition de classe est faite dans un fichier qui est nommé exactement comme la classe dont vous voulez le nom.
Comme c'est généralement le cas, la réponse ci-dessus devrait le faire pour la plupart des cas . Mais dans certains cas particuliers, vous devrez peut-être trouver une solution différente.
Si vous avez besoin du nom de classe dans la classe (fichier) elle-même, vous pouvez simplement utiliser cette ligne:
Peut-être que cette méthode aide certaines personnes.
la source
Sur la base des réponses et des commentaires donnés par Klass et Kevin Ballard ci-dessus, j'irais avec:
qui imprimera:
la source
toString(self.dynamicType).componentsSeparatedByString(".").last!
:, évidemment, j'étais dans un contexte d'objet et capable de faire référenceself
.la source
Swift version 4:
Merci @Joshua Dance
la source
Swift 4:
Usage:
la source
Il ne semble pas y avoir de moyen générique pour imprimer le nom de type du type d'une valeur arbitraire. Comme d'autres l'ont noté, pour les instances de classe , vous pouvez imprimer
value.className
mais pour les valeurs primitives, il semble qu'au moment de l'exécution, les informations de type ont disparu.Par exemple, il semble qu'il n'y ait aucun moyen de taper:
1.something()
et de sortirInt
pour n'importe quelle valeur desomething
. (Vous pouvez, comme une autre réponse l'a suggéré, utiliseri.bridgeToObjectiveC().className
pour vous donner un indice, mais ce__NSCFNumber
n'est pas vraiment le type dei
- juste ce à quoi il sera converti lorsqu'il franchira la limite d'un appel de fonction Objective-C.)Je serais heureux d'avoir tort, mais il semble que la vérification de type soit entièrement effectuée au moment de la compilation, et comme C ++ (avec RTTI désactivé), la plupart des informations de type ont disparu au moment de l'exécution.
la source
C'est ainsi que vous obtenez une chaîne de type de votre objet ou Type qui est cohérent et prend en compte à quel module la définition d'objet appartient ou est imbriquée. Fonctionne dans Swift 4.x.
la source
Pour obtenir un type d'objet ou une classe d'objet dans Swift , vous devez utiliser un type (de: yourObject)
type (de: votreObjet)
la source
Pas exactement ce que vous recherchez, mais vous pouvez également vérifier le type de la variable par rapport aux types Swift comme ceci:
Par exemple.
la source
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
la source