Lorsque vous essayez de comprendre un programme, ou dans certains cas, il est utile de pouvoir réellement savoir de quel type est un élément. Je sais que le débogueur peut vous montrer des informations de type, et vous pouvez généralement compter sur l'inférence de type pour éviter de spécifier le type dans ces situations, mais j'aimerais vraiment avoir quelque chose comme Pythontype()
dynamicType (voir cette question )
Mise à jour: cela a été changé dans une version récente de Swift, obj.dynamicType
vous donne maintenant une référence au type et non à l'instance du type dynamique.
Celui-ci semble le plus prometteur, mais jusqu'à présent, je n'ai pas pu trouver le type réel
class MyClass {
var count = 0
}
let mc = MyClass()
# update: this now evaluates as true
mc.dynamicType === MyClass.self
J'ai également essayé d'utiliser une référence de classe pour instancier un nouvel objet, ce qui fonctionne, mais m'a étrangement donné une erreur disant que je dois ajouter un required
initialiseur:
travaux:
class MyClass {
var count = 0
required init() {
}
}
let myClass2 = MyClass.self
let mc2 = MyClass2()
Mais ce n'est qu'un petit pas vers la découverte du type d'un objet donné
modifier : j'ai supprimé un nombre important de détails désormais non pertinents - consultez l'historique des modifications si vous êtes intéressé :)
la source
print(mc)
oudump(mc)
imprimera un résumé (que vous pouvez obtenir à partir detoString(mc)
oureflect(mc).summary
), qui contiendra le nom de la classe quelque part. Mais il n'est pas clair comment obtenir vous-même le nom de la classe.Réponses:
Version Swift 3:
la source
var myVar: SomeType!
. Le compilateur renvoie l'erreur «Impossible de convertir la valeur de type« SomeType! .Type »(alias« ImplicitlyUnwrappedOptional <SomeType> .Type ») en type d'argument attendu« AnyClass »(alias« AnyObject.Type ») Le compilateur suggère d'ajouteras! AnyClass
après le type mais ensuite programme se bloque avec certains "EXC_BAD_INSTRUCTION" et autres jiberrish que je ne peux pas déchiffrer.String
qui est passé en tant que type ,Any
puis latype(of:)
sortie de volontéAny
, nonString
.Swift 2.0:
La bonne façon de faire ce type d'introspection de type serait avec la structure Mirror ,
Ensuite, pour accéder au type lui-même à partir de la
Mirror
structure, vous utiliseriez la propriétésubjectType
comme suit:Vous pouvez ensuite utiliser quelque chose comme ceci:
la source
String
etOptional(String)
ne sont pas les mêmes.Le
dynamicType.printClassName
code provient d'un exemple du livre Swift. Je ne connais aucun moyen de récupérer directement un nom de classe personnalisé, mais vous pouvez vérifier un type d'instance en utilisant leis
mot - clé comme indiqué ci-dessous. Cet exemple montre également comment implémenter une fonction className personnalisée, si vous voulez vraiment que le nom de classe soit une chaîne.Remarque:
ces sous-classes
NSObject
implémentent déjà leur propre fonction className. Si vous travaillez avec Cocoa, vous pouvez simplement utiliser cette propriété.la source
subjectType
n'est plus disponible etdynamicType
provoque un message de dépréciation du compilateur.Depuis Xcode 6.0.1 (au moins, je ne sais pas quand ils l'ont ajouté), votre exemple d'origine fonctionne maintenant:
Mettre à jour:
Pour répondre à la question d'origine, vous pouvez réellement utiliser le runtime Objective-C avec des objets Swift simples avec succès.
Essayez ce qui suit:
la source
Si vous avez simplement besoin de vérifier si la variable est de type X ou si elle est conforme à un protocole, vous pouvez utiliser
is
, ouas?
comme dans ce qui suit:C'est l'équivalent d'
isKindOfClass
Obj-C.Et cela équivaut à
conformsToProtocol
, ouisMemberOfClass
la source
as?
conversion conditionnelle fait de mêmeisKindOfClass
également, fournit également le résultat de la conversion si elle réussit.isMemberOfClass
est la conditionobject.dynamicType == ClassName.self
.Swift 3:
la source
is
existe avant Swift 3 ...?Pour Swift 3.0
Pour Swift 2.0 - 2.3
la source
Voici 2 façons dont je recommande de le faire:
Ou:
Voici un exemple détaillé:
la source
print( aShape is Square )
, l'is
opérateur est plus préférable.Dépend du cas d'utilisation. Mais supposons que vous vouliez faire quelque chose d'utile avec vos types "variables". L'
switch
instruction Swift est très puissante et peut vous aider à obtenir les résultats que vous recherchez ...Dans ce cas, ayez un dictionnaire simple qui contient des paires clé / valeur qui peuvent être UInt, Int ou String. Dans la
.filter()
méthode du dictionnaire, je dois m'assurer de tester correctement les valeurs et de ne tester une chaîne que lorsqu'elle est une chaîne, etc. L'instruction switch rend cela simple et sûr! En affectant 9 à la variable de type Any, il fait exécuter le commutateur Int. Essayez de le changer en:..et réessayez. Cette fois, il exécute l'
as String
affaire.la source
Si vous obtenez un avertissement "toujours vrai / échoue", vous devrez peut-être effectuer un cast vers Any avant d'utiliser
is
la source
la source