Obtenir un nom de classe de l'objet comme une chaîne de caractères en Swift
Obtenir le nom de classe d'un objet sous forme de chaîne à l'aide de
object_getClassName(myViewController)
renvoie à quelque chose comme ceci
_TtC5AppName22CalendarViewController
Je suis à la recherche pour le pur version: "CalendarViewController". Comment puis-je obtenir un nettoyé chaîne du nom de la classe?
J'ai trouvé quelques tentatives de questions à ce sujet, mais pas une réponse réelle. Il n'est pas possible?
- sinon ... ce serait efficace, un analyseur de fonction pour que cela ressemble?
- Dans le cas où vous souhaitez vérifier si un objet est d'une certaine classe voir cette réponse.
Vous devez vous connecter pour publier un commentaire.
Chaîne à partir d'un instance:
Chaîne à partir d'une type:
Exemple:
Testé avec
class
,struct
etenum
.String(describing: MyViewController.self)
comme indiqué dans les quelques réponses ci-dessous.MyViewController
.type(of: self)
au lieu deYourType.self
(autre Façon dans l'exemple).type(of:)
est évaluée dynamiquement à l'exécution alors queType.self
ne l'est pas.Foo
àFoo2
mais créer une classeFoo
ailleurs, qui pourrait freiner le code). En cas de sous-classement, vous devez utilisertype(of:)
ouType.self
selon ce qui convient à votre besoin. Probablementtype(of:)
est plus approprié pour obtenir le nom de la classe.MIS À JOUR À SWIFT 5
Nous pouvons obtenir assez de descriptions des types de noms à l'aide de la variable d'instance par le biais de la
String
initialiseur et créer de nouveaux objets d'une certaine classeComme, par exemple
print(String(describing: type(of: object)))
. Oùobject
peut être un variable d'instance tableau, un dictionnaire, unInt
, unNSDate
, etc.Parce que
NSObject
est la classe racine de la plupart Objective-C hiérarchies de classe, vous pouvez essayer de faire une extension pourNSObject
pour obtenir le nom de la classe de chaque sous-classe deNSObject
. Comme ceci:Ou vous pourriez faire un statique de la fonction dont le paramètre est de type
Any
(Le protocole auquel tous les types implicitement conformité) et retourne le nom de la classe String. Comme ceci:Maintenant, vous pouvez faire quelque chose comme ceci:
Aussi, une fois, on peut obtenir le nom de la classe comme une Chaîne de caractères, nous pouvons instancier de nouveaux objets de cette classe:
Peut-être que cela aide quelqu'un là-bas!.
classNameAsString
peut être simplifié àclassName
, pour qui "nom" implicite de son type.theClassName
est similaire à facebook de l'histoire, qui est nommé thefacebook à l'origine.Swift 4.2
Ici est l'extension pour obtenir le
typeName
comme une variable (pour les deux type de la valeur de référence ou type).Comment utiliser:
Swift 3.0
String(describing: MyViewController.self)
type(of: )
est trop là,String(describing: MyViewController.self)
suffiraString.init(describing: MyViewController.self)
?init
est inutile.Je suggère une telle approche (très Swifty):
Il n'utilise pas ni introspection ni manuel demangling (pas de magie!).
Voici une démo:
type(of: self)
Si vous avez un type
Foo
, le code suivant va vous donner"Foo"
dans Swift 3 et Swift 4:Le problème avec la plupart des réponses ici sont qu'ils vous donnent
"Foo.Type"
que la chaîne résultante lorsque vous n'avez pas une instance de ce type, quand ce que vous voulez vraiment est juste"Foo"
. Le suivant vous donne"Foo.Type"
, comme mentionné dans un tas d'autres réponses.La
type(of:)
partie est inutile si vous voulez juste"Foo"
.Dans Swift 4.1 et maintenant Swift 4.2 :
Si vous n'avez pas une instance autour de:
Si vous avez une instance autour de:
Vous pouvez utiliser la Swift de la bibliothèque standard fonction appelée
_stdlib_getDemangledTypeName
comme ceci:Pour obtenir le nom du type comme une chaîne de caractères dans Swift 4 (je n'ai pas vérifié les versions antérieures), il suffit d'utiliser la chaîne de l'interpolation:
Vous pouvez utiliser
.self
sur un type en lui-même, et letype(of:_)
fonction sur un exemple:Vous pouvez essayer de cette façon:
On peut aussi utiliser des miroirs:
NB: Cette méthode peut également être utilisé pour les Structures et les Énumérations. Il y a un displayStyle qui donne une indication de ce type de la structure:
Le retour est un enum de sorte que vous pouvez:
Swift 3.0:
Vous pouvez créer une extension comme celui-ci.. Il donne le nom de la classe sans le nom du projet
J'ai été à la recherche pour répondre à cette question pendant un certain temps. J'utilise GKStateMachine et aime observer les changements d'état et voulait un moyen facile de voir juste le nom de la classe. Je ne suis pas sûr si c'est juste iOS 10 ou Swift 2.3, mais dans cet environnement, la suite est exactement ce que je veux:
Essayer
reflect().summary
sur la Classe de l'auto ou de l'instance dynamicType. Déballer les options avant d'en arriver dynamicType sinon le dynamicType est l'Option wrapper.Le résumé est un chemin de classe avec les types génériques décrites. Pour obtenir un simple nom de la classe à partir du résumé d'essayer cette méthode.
Les solutions ci-dessus ne fonctionne pas pour moi. Le produit principalement les questions de mentionner dans plusieurs commentaires:
ou
Cette solutions travaillé sur XCode 9, Swift 3.0:
J'ai nommé il
classNameCleaned
de sorte qu'il est plus facile d'accès et n'entre pas en conflit avec les futursclassName()
changements:}
Utilisation:
Vous pouvez étendre
NSObjectProtocol
dans Swift 4 comme ceci :Cela permettra de calculer des variables
className
disponible pour TOUTES les classes. L'utilisation de ce à l'intérieur d'unprint()
dansCalendarViewController
imprime"CalendarViewController"
dans la console.Pour obtenir le nom d'un Swift de la classe d'un objet, par exemple pour la var objet: SomeClass(), utilisez
Pour obtenir le nom d'un Swift classe à partir d'un type de classe, par exemple SomeClass, utilisation:
De sortie:
Pour obtenir un nom de classe comme Chaîne de déclarer votre classe comme suit
Et obtenir un nom de classe en utilisant la syntaxe suivante
Swift 3.0 (mac os 10.10 et ultérieure), vous pouvez l'obtenir à partir d'un nom de classe
NSObject
developer.apple.com/reference/objectivec/nsobject/...J'ai essayé
type(of:...)
dans l'aire de Jeux avec Swift 3. C'est mon résultat.C'est le format de code de la version.
Vous pouvez obtenir le nom de la classe de faire quelque chose comme:
Si vous n'aimez pas la déformation d'un nom, vous pouvez dicter votre propre nom:
Cependant, il serait mieux dans le long terme, d'apprendre à analyser la déformation d'un nom. Le format est standard et significatives et ne change pas.
- Je l'utiliser dans Swift 2.2
Parfois les autres solutions non nom utile en fonction de ce que l'objet que vous essayez de regarder. Dans ce cas, vous pouvez obtenir le nom de la classe comme une chaîne de caractères à l'aide de la suite.
⌘ cliquez sur la fonction dans xcode pour voir quelques méthodes qui sont assez utiles. ou consultez ici les https://developer.apple.com/reference/objectivec/objective_c_functions
Dans mon cas String(décrivant: auto) a renvoyé quelque chose comme:
Mais j'aimerais avoir quelque chose comme
getSimpleName
sur Android.J'ai donc créé une petite extension:
Et maintenant il retourne:
L'extension de NSObject au lieu de UIViewController devrait également fonctionner. La fonction ci-dessus est également fail-safe 🙂