Obtenez de l'utilisateur, version lisible du nom de la classe dans swift (en objc NSStringFromClass était très bien)
Est-il un équivalent de NSStringFromClass dans Swift qui donne à l'utilisateur-version lisible du nom de la classe? J'ai essayé de l'utiliser avec un modèle Swift classe que j'ai créée, mais comme vous pouvez le voir, le résultat semble être le compilateur de la représentation interne de la classe nom:
println(NSStringFromClass(MyClass.self))
Résultat:
_TtC5test7MyClass
J'ai essayé d'ajouter le @objc attribut de la classe, et d'en faire une sous-classe de NSObject, mais il ne fait aucune différence. J'ai découvert que si je remplace MyClass avec un Objectif-C classe du même nom, et l'importer dans la transition de l'en-tête, il me donne "MyClass", mais cela ne devrait pas être nécessaire.
Une autre option serait de faire un protocole pour cela, que chaque classe, que je veux utiliser ce moyen doit être conforme à:
protocol Nameable {
class var className: String { get }
}
Cependant, il serait plus facile d'avoir un haut-moyen de le faire dans la langue.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez maintenant juste à faire:
String(describing: self)
ou simplement de passage de l'objetlet object = MyClass()
String(describing: object)
nouveau format basé sur xcode 6 beta 5.
(project_name).(class_name)
Dernier Xcode 6.3 Swift 1.2
si vous avez besoin d'une extension ou vous pouvez mettre sur n'importe quel objet commun:
classType.self
devrait être écrit commeclassType
NSStringFromClass(self).componentsSeparatedByString(".").last!
String(MyClass)
maintenant.Swift 3
type(of: self)
imprime ModuleName.ClassNameString(describing: type(of: self))
imprime ClassNamePour le moment, il n'y a aucun moyen fiable de le faire. Voir un des développeurs d'Apple commentaire de https://devforums.apple.com/thread/227425
Swift ne ont la notion de metatype, un peu analogue au type de Classe en Objective C. Vous pouvez le trouver à l'aide de
TypeName.self
, par exemple:Peut-être, par la libération de temps, metatypes comprendront de plus en plus à l'introspection capacités. Je suggère le dépôt d'un Radar de demande de fonctionnalité pour cette.
Dans Swift 2 beta 4, vous pouvez obtenir de l'information via le type de l'objet:
ou si vous avez une instance:
Vous obtenez le Module.Class résultat, comme:
Assez drôle, le Type d'objet retourné ne paraît pas conforme à la CustomStringConvertible protocole. Par conséquent, il n'a pas de description de la propriété, bien que la "" modèle encore fait la bonne chose.
P. S.: Avant b4 la même chose peut être accomplie à l'aide de réfléchir(obj.dynamicType).résumé.
Dans Swift v3.0, cela a fonctionné pour moi:
----- Mise à jour -----
Comme @ThomasW mentionné, pour Swift 4, nous avons besoin d'utiliser
String(describing:type(of:self))
----- L'ancien poste ----
Je préfère utiliser
String(self.dynamicType)
L'utiliser dans mon projet https://github.com/JakeLin/SwiftWeather/blob/e7165b0919dda53fd7fcba9b43fdfe150d73c6f8/SwiftWeather/ForecastView.swift#L135
String(describing:type(of:self))
n'.Si vous voulez avoir que le nom de la classe dans swift, vous pouvez analyser la chaîne de caractères retournée par NSStringFromClass().
Ceci est fait dans nameOfClass.swift de la INSwift Github:
https://github.com/indieSoftware/INSwift
error: type 'MyProtocol' does not conform to protocol 'AnyObject'
Vous shouls maintenant être en mesure d'utiliser les éléments suivants pour récupérer le nom de la classe dans swift
C'est un peu plus courte. Pas besoin de
NSStringFromClass
Ici est Swift 3+, Xcode, 8+ exemple avec le code:
Ce n'est pas exactement ce que vous voulez - il va ajouter indésirables conduisant '<' et les ':'. Mais quand je suis débogage j'valeur de la vitesse au-dessus de la propreté donc cette rapide + sale truc a fonctionné pour moi.
Swift 3
Swift 4