Mise à jour de septembre 2016
Swift 3.0 : Utilisez type(of:)
par exemple type(of: someThing)
(puisque le dynamicType
a été supprimé)
Mise à jour octobre 2015 :
J'ai mis à jour les exemples ci-dessous avec la nouvelle syntaxe de Swift 2.0 (par ex. println
a été remplacé par print
, toString()
est maintenant String()
).
Extrait des notes de publication de Xcode 6.3 :
@nschum fait remarquer dans les commentaires que la Notes de publication de Xcode 6.3 montrer une autre voie :
Les valeurs de type s'impriment désormais sous la forme du nom complet du type démêlé lorsqu'elles sont utilisées avec la commande println ou l'interpolation de chaîne.
import Foundation
class PureSwiftClass { }
var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"
print( "String(myvar0.dynamicType) -> \(myvar0.dynamicType)")
print( "String(myvar1.dynamicType) -> \(myvar1.dynamicType)")
print( "String(myvar2.dynamicType) -> \(myvar2.dynamicType)")
print( "String(myvar3.dynamicType) -> \(myvar3.dynamicType)")
print( "String(Int.self) -> \(Int.self)")
print( "String((Int?).self -> \((Int?).self)")
print( "String(NSString.self) -> \(NSString.self)")
print( "String(Array<String>.self) -> \(Array<String>.self)")
Quelles sorties :
String(myvar0.dynamicType) -> __NSCFConstantString
String(myvar1.dynamicType) -> PureSwiftClass
String(myvar2.dynamicType) -> Int
String(myvar3.dynamicType) -> String
String(Int.self) -> Int
String((Int?).self -> Optional<Int>
String(NSString.self) -> NSString
String(Array<String>.self) -> Array<String>
Mise à jour pour Xcode 6.3 :
Vous pouvez utiliser le _stdlib_getDemangledTypeName()
:
print( "TypeName0 = \(_stdlib_getDemangledTypeName(myvar0))")
print( "TypeName1 = \(_stdlib_getDemangledTypeName(myvar1))")
print( "TypeName2 = \(_stdlib_getDemangledTypeName(myvar2))")
print( "TypeName3 = \(_stdlib_getDemangledTypeName(myvar3))")
et j'obtiens ceci comme résultat :
TypeName0 = NSString
TypeName1 = __lldb_expr_26.PureSwiftClass
TypeName2 = Swift.Int
TypeName3 = Swift.String
Réponse originale :
Avant Xcode 6.3 _stdlib_getTypeName
a obtenu le nom de type tronqué d'une variable. Entrée du blog d'Ewan Swick aide à déchiffrer ces chaînes de caractères :
par exemple _TtSi
représente le système interne de Swift Int
type.
Mike Ash a un excellent article de blog couvrant le même sujet. .
44 votes
@JasonMArcher Dites-moi comment cela peut être un doublon si la question que vous avez liée a été posée 4 jours après celle-ci ?
0 votes
Il existe un certain nombre de questions concernant le test du type d'un objet Swift ou la lecture du type d'un objet Swift. Nous sommes en train de trouver les meilleures questions à utiliser comme questions "maîtresses" pour ce sujet. Le duplicata suggéré a une réponse beaucoup plus approfondie. Cela ne veut pas dire que vous avez fait quelque chose de mal, mais simplement que nous essayons de réduire le désordre.
4 votes
Le doublon proposé ne répond pas à la même question ; Type.self ne peut pas être imprimé sur la console à des fins de débogage, il est destiné à être utilisé pour passer à d'autres fonctions qui prennent les Types comme objets.
2 votes
OT : Il est très étrange que Swift n'offre pas cette fonctionnalité dès le départ et que l'on doive bricoler avec des bibliothèques C de si bas niveau. Cela vaut-il la peine de signaler un bug ?
0 votes
Les gars, j'ai fourni ma réponse ci-dessous. Veuillez y jeter un coup d'œil et me faire savoir si c'est ce que vous attendez.