Lorsque vous essayez de comprendre un programme, ou dans certains coin de cas, il est utile d'être en mesure de découvrir ce type est une chose. Je sais que le débogueur peut vous montrer un certain type d'informations, et vous pouvez généralement compter sur l'inférence de type pour s'en tirer avec ne pas spécifier le type dans ces situations, mais tout de même, je voudrais vraiment avoir quelque chose comme python type()
J'ai eu une bonne quantité de la difficulté à décider de Swift introspection en général :)
dynamicType (voir à cette question)
Mise à jour: ce qui a été modifié dans une version récente de Swift, obj.dynamicType
vous donne désormais une référence pour le type, et non pas une instance avec le type dynamique.
Celui-ci semble la plus prometteuse, mais jusqu'à présent, je n'ai pas été en mesure de trouver le type réel
class myClass {
var count = 0
}
let mc = myClass()
# update: this now evaluates as true
mc.dynamicType === myClass.self
les rendements de l'erreur:
Playground execution failed: error: <REPL>:10:16: error: could not find an
overload for '===' that accepts the supplied arguments
mc.dynamicType === myClass.self
~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
ce qui ne veut pas nécessairement dire qu'ils ne sont pas égaux, mais juste qu'il n'y a aucun moyen de les comparer. Donc, nous n'avons rien appris :(
J'ai aussi essayé d'utiliser une référence de classe à instancier un nouvel objet, qui n' travail, mais bizarrement, m'a donné un message d'erreur indiquant que je dois ajouter un required
initialiseur:
œuvres:
class myClass {
var count = 0
required init() {
}
}
let myClass2 = myClass.self
let mc2 = myClass2()
Encore qu'une petite étape vers la fait découvrir le type d'un objet donné, si
Mise à jour: le suivant ne fonctionne plus...
J'ai aussi semblent certaines personnes, ce qui suggère .dynamicType.printClassName()
mais qui génère une erreur pour moi:
mc2.dynamicType.printClassName()
erreur:
Playground execution failed: error: <REPL>:13:5: error: 'myClass.Type'
does not have a member named 'printClassName'
mc2.dynamicType.printClassName()
^ ~~~~~~~~~~~~~~
Edit: j'ai mal compris dynamicType
. C'est en fait juste un moyen d'accéder à l'exécution type de la variable. Par exemple:
class BaseClass {
var x = 1
func foo() {
println("hello")
}
}
class SubClass: BaseClass {
var y = 9
func foo() {
println("hola")
}
}
let x: BaseClass = SubClass()
// prints "hello"
x.foo()
// Error:
print(x.y)
// prints "hola"
x.dynamicType.foo()
// totally fine:
print(x.dynamicType.y)