Obtenir le nom (chaîne de caractères) d'un type générique dans Swift
J'ai une classe générique de type T et j'aimerais avoir le nom du type qui est passé dans la classe lorsqu'il est instancié. Ici est un exemple.
class MyClass<T> {
func genericName() -> String {
//Return the name of T.
}
}
J'ai été en regardant autour de heures et je n'arrive pas à trouver de toute façon de le faire. Quelqu'un a déjà essayé ce encore?
Toute aide est grandement appréciée.
Grâce
- Cela dépend de ce que tu veux dire par "nom". Vous pouvez obtenir le nom de la fonction Objective-C vraiment facilement, par l'impression de l'objet de classe. Cependant, pour une classe définie dans Swift, ce nom peut être déformés. Si vous avez besoin d'avoir une certaine idée de ce que c'est, alors cela devrait être suffisant.
Vous devez vous connecter pour publier un commentaire.
Un pur moyen rapide d'y parvenir est pas possible.
Une solution possible est:
Les limites repose sur le fait qu'il fonctionne avec des classes seulement.
Si c'est le type générique:
NSStringFromClass()
renvoie le nom complet (y compris l'espace de noms):C'est pourquoi la touche func recherche la dernière occurrence de la
.
caractère.Testé comme suit:
Mise à JOUR de Swift 3.0
Vous pouvez retourner n'importe quel types de nom par l'aide de la chaîne d'interpolation:
Vous pouvez l'essayer dans une aire de jeu et il fonctionne comme prévu:
String(describing: T.self)
dans Swift 3+Dans le type générique, le nom de type
T
par la conversion deT.self
outype(of: T.self)
à unString
. J'ai trouvé quetype(of:)
n'était pas nécessaire, mais il vaut la peine d'être conscient de depuis dans d'autres cas, il supprime d'autres détails sur le Type.L'exemple suivant illustre obtenir le nom du type générique
T
au sein d'une structure et d'une classe. Il comprend le code pour obtenir le nom du type contenant.Exemple, y compris la classe et struct
Sortie De La Console
C'est possible si votre paramètre de type implémente une commune protocole de nommage.
Dans l'exemple ci-dessous le protocole
Named
assure que le type générique met en œuvre laname
des propriétés de la classe.Notez que cela fonctionne avec les deux classes et types de valeur puisque celle-ci peut également être étendue à se conformer à des protocoles, comme illustré à la
Int
ci-dessous.Une autre solution qui pourrait aider quelqu'un:
Aire de jeux