277 votes

Comment trouvez-vous le type d’un objet (dans Swift) ?

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)

60voto

Dash Points 1982

Le "dynamicType.printClassName" code à partir d'un exemple dans l'Swift livre. Il n'ya aucun moyen que je connaisse pour saisir directement une classe personnalisée nom, mais vous pouvez vérifier un cas type à l'aide de la "est un" mot clé comme indiqué ci-dessous. Cet exemple montre également comment mettre en œuvre une coutume className fonction, si vous voulez vraiment le nom de la classe comme une chaîne de caractères.

class Shape {
    class func className() -> String {
        return "Shape"
    }
}

class Square: Shape {
    override class func className() -> String {
        return "Square"
    }
}

class Circle: Shape {
    override class func className() -> String {
        return "Circle"
    }
}

func getShape() -> Shape {
    return Square() // hardcoded for example
}

let newShape: Shape = getShape()
newShape is Square // true
newShape is Circle // false
newShape.dynamicType.className() // "Square"
newShape.dynamicType.className() == Square.className() // true

Notez que les sous-classes de NSObject déjà mettre en œuvre leurs propres className fonction. Si vous travaillez avec du Cacao, vous pouvez simplement utiliser cette propriété.

class MyObj: NSObject {
    init() {
        super.init()
        println("My class is \(self.className)")
    }
}
MyObj()

42voto

Alex Pretzlav Points 2475

À partir de Xcode 6.0.1 (du moins, pas sûr quand ils ont ajoutent), votre exemple d’origine fonctionne maintenant :

Mise à jour :

Pour répondre à la question initiale, vous pouvez réellement utiliser le runtime Obj-C avec simples objets Swift avec succès.

Essayez ce qui suit :

38voto

user1810980 Points 87

Si vous devez simplement vérifier la météo est la variable de type X, ou qu’il se conforme à un protocole, alors vous pouvez utiliser , ou comme suivi :

C’est l’équivalent de `` en Obj-C.

Et c’est l’équivalent de , ou

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X