Obtenir le nom de classe d'un objet en String
utilisant:
object_getClassName(myViewController)
renvoie quelque chose comme ceci:
_TtC5AppName22CalendarViewController
Je cherche la pureté version: "CalendarViewController"
. Comment puis-je obtenir une chaîne nettoyée du nom de classe à la place?
J'ai trouvé quelques tentatives de questions à ce sujet mais pas une réponse réelle. N'est-ce pas possible du tout?
Réponses:
Chaîne d'une instance :
Chaîne d'un type :
Exemple:
Testé avec
class
,struct
etenum
.la source
String(describing: MyViewController.self)
comme indiqué dans quelques réponses ci-dessous.Foo
pourFoo2
mais créer une classeFoo
ailleurs, qui pourrait freiner le code). En cas de sous-classement, vous devez utiliser soittype(of:)
ouType.self
selon ce qui correspond à vos besoins.type(of:)
Est probablement plus approprié pour obtenir le nom de la classe.MISE À JOUR DE SWIFT 5
Nous pouvons obtenir de jolies descriptions des noms de types en utilisant la variable d'instance via l'
String
initialiseur et créer de nouveaux objets d'une certaine classeComme, par exemple
print(String(describing: type(of: object)))
. Oùobject
peut être une variable d'instance comme un tableau, un dictionnaire, unInt
, unNSDate
, etc.Étant donné qu'il
NSObject
s'agit de la classe racine de la plupart des hiérarchies de classes Objective-C, vous pouvez essayer de créer une extension pourNSObject
obtenir le nom de classe de chaque sous-classe deNSObject
. Comme ça:Ou vous pouvez créer une fonction statique dont le paramètre est de type
Any
(le protocole auquel tous les types se conforment implicitement) et renvoie le nom de classe en tant que chaîne. Comme ça:Vous pouvez maintenant faire quelque chose comme ceci:
De plus, une fois que nous pouvons obtenir le nom de la classe en tant que chaîne, nous pouvons instancier de nouveaux objets de cette classe :
Peut-être que cela aide quelqu'un là-bas !.
la source
classNameAsString
peut être simplifiéclassName
, car ce "nom" impliquait son type.theClassName
est similaire à l'histoire de Facebook, qui s'appelle à l'origine thefacebook.ProjectTest.MyViewController
. Comment puis-je me débarrasser de ce nom de projet? Je veux seulement un nom de classe.Swift 5
Voici l'extension pour obtenir le en
typeName
tant que variable (travailler avec le type de valeur ou le type de référence).Comment utiliser:
la source
Swift 3.0
String(describing: MyViewController.self)
la source
type(of: )
c'est une surpuissance là-bas,String(describing: MyViewController.self)
suffiraString.init(describing: MyViewController.self)
?init
n'est pas nécessaire.Je propose une telle approche ( très Swifty ):
Il n'utilise ni introspection ni démêlage manuel ( pas de magie! ).
Voici une démo:
la source
type(of: self)
Si vous avez du type
Foo
, le code suivant vous donnera"Foo"
dans Swift 3 et Swift 4:Le problème avec la plupart des réponses ici est qu'elles vous donnent
"Foo.Type"
la chaîne résultante lorsque vous n'avez aucune instance du type, lorsque ce que vous voulez vraiment est juste"Foo"
. Ce qui suit vous donne"Foo.Type"
, comme mentionné dans un tas d'autres réponses.La
type(of:)
partie est inutile si vous le souhaitez"Foo"
.la source
Dans Swift 4.1 et maintenant Swift 4.2 :
Si vous n'avez pas d'instance autour:
Si vous avez une instance autour:
la source
Pour obtenir le nom d'une classe Swift à partir d'un objet, par exemple pour un objet var: SomeClass (), utilisez
Pour obtenir le nom d'une classe Swift à partir d'un type de classe, par exemple SomeClass, utilisez:
Production:
la source
Vous pouvez essayer de cette façon:
la source
Vous pouvez utiliser la fonction de bibliothèque standard Swift appelée
_stdlib_getDemangledTypeName
comme ceci:la source
Pour obtenir le nom du type sous forme de chaîne dans Swift 4 (je n'ai pas vérifié les versions antérieures), utilisez simplement l'interpolation de chaîne:
Vous pouvez utiliser
.self
sur un type lui-même et latype(of:_)
fonction sur une instance:la source
On peut également utiliser des miroirs:
NB: Cette méthode peut également être utilisée pour les structures et les énumérations. Il y a un displayStyle qui donne une indication de quel type de structure:
Le retour est une énumération pour que vous puissiez:
la source
Swift 5.1
Vous pouvez cependant obtenir les noms de classe, de structure, d'énumération, de protocole et de NSObject
Self.self
.la source
String(describing: type(of: self))
)Swift 3.0: Vous pouvez créer une extension comme celle-ci. Elle donne le nom de la classe sans le nom du projet
la source
Vous pouvez étendre
NSObjectProtocol
dans Swift 4 comme ceci:Cela rendra la variable calculée
className
disponible pour TOUTES les classes. L' utilisation de ce à l' intérieur d' unprint()
dansCalendarViewController
imprimera"CalendarViewController"
dans la console.la source
Je cherche cette réponse de temps en temps. J'utilise GKStateMachine et j'aime observer les changements d'état et je voulais un moyen facile de voir juste le nom de la classe. Je ne sais pas si c'est juste iOS 10 ou Swift 2.3, mais dans cet environnement, ce qui suit fait exactement ce que je veux:
la source
Vous pouvez obtenir le nom de la classe en faisant quelque chose comme:
la source
Pour obtenir le nom de classe en tant que chaîne, déclarez votre classe comme suit
Et obtenez le nom de la classe en utilisant la syntaxe suivante
la source
Essayez
reflect().summary
Class auto ou instance dynamicType. Déballez les options avant d'obtenir dynamicType, sinon le dynamicType est l'encapsuleur facultatif.Le résumé est un chemin de classe avec des types génériques décrits. Pour obtenir un nom de classe simple à partir du résumé, essayez cette méthode.
la source
Les solutions ci-dessus n'ont pas fonctionné pour moi. Le produit principalement les problèmes mentionnés dans plusieurs commentaires:
ou
Ces solutions ont fonctionné sur XCode 9, Swift 3.0:
Je l'ai nommé
classNameCleaned
pour qu'il soit plus facile d'accès et n'entre pas en conflit avec lesclassName()
changements futurs :}
Usage:
la source
Swift 3.0 (macOS 10.10 et versions ultérieures), vous pouvez l'obtenir à partir de className
la source
NSObject
developer.apple.com/reference/objectivec/nsobject/…J'ai essayé
type(of:...)
dans Playground avec Swift 3. C'est mon résultat. Ceci est la version au format de code.la source
Swift 5
la source
Ce genre d'exemple pour la classe var. N'incluez pas le nom de l'ensemble.
la source
Si vous n'aimez pas le nom mutilé, vous pouvez dicter votre propre nom:
Cependant, il serait préférable à long terme d'apprendre à analyser le nom mutilé. Le format est standard et significatif et ne changera pas.
la source
Parfois, les autres solutions donneront un nom non utile en fonction de l'objet que vous essayez de regarder. Dans ce cas, vous pouvez obtenir le nom de classe sous forme de chaîne en utilisant ce qui suit.
⌘ cliquez sur la fonction dans xcode pour voir quelques méthodes connexes qui sont assez utiles. ou consultez ici https://developer.apple.com/reference/objectivec/objective_c_functions
la source
Swift 5 Vous pouvez obtenir nom_classe sous forme de chaîne avec String (décrivant: Self.self)
la source
Swift 5.2:
la source
Je l'utilise dans Swift 2.2
la source
Swift 5.1: -
Vous pouvez également utiliser une fonction générique pour obtenir le nom de classe de l'objet sous forme de chaîne
Appelez cette fonction en utilisant ce qui suit: -
Happy Coding :)
la source