6 votes

Pourquoi type(of :) renvoie-t-il Metatype, plutôt que T.Type ?

J'ai remarqué que type(of:) a cette signature inattendue :

func type<T, Metatype>(of value: T) -> Metatype

alors que je m'y attendais :

func type<T>(of value: T) -> T.Type

La signature actuelle prend en quelque sorte 2 paramètres de type indépendants et non bornés, utilise l'un d'entre eux comme type de paramètre, et l'autre comme type de retour. Cela semble suggérer que je peux faire quelque chose de stupide comme ceci :

let foo: String = type(of: 1) // T is Int, Metatype is String

Mais quand je l'ai vraiment essayé,

Impossible de convertir la valeur du type 'Int.Type' en type spécifié 'String'.

Donc je n'ai pas à spécifier Metatype après tout, même s'il s'agit d'un paramètre de type générique. J'étais curieux de savoir comment le compilateur s'y prenait, et j'ai donc consulté la page d'accueil du site Web de la Commission européenne. code source et vérifié. Je pense ce qui m'empêche de faire cette chose stupide, c'est ça. @_semantics annotation :

@_transparent
@_semantics("typechecker.type(of:)")
public func type<T, Metatype>(of value: T) -> Metatype {

J'ai également vu quelques commentaires expliquant que l'implémentation écrite ici n'est pas réellement appelée, et que cela est directement géré par le vérificateur de type lui-même. Mais cela ne répond pas à ma question - pourquoi type(of:) retourner un paramètre de type complètement indépendant Metatype plutôt que T.Type ?

Je pense qu'il y a un cas limite où type(of:) retournera un type complètement étranger à T mais je n'ai aucune idée de ce que c'est.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X