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.