27 votes

Métatype de métatype

Dans Swift, nous pouvons écrire la construction suivante:

 class SomeClass {}
let metaMetatype: SomeClass.Type.Type = SomeClass.Type.self
 

Ici metaMetatype n'est pas conforme au type AnyObject ( SomeClass.Type fait). La construction peut être encore plus longue, tant que nous le souhaitons:

 let uberMetatype: SomeClass.Type.Type.Type.Type.Type.Type.Type.Type.Type.Type = SomeClass.Type.Type.Type.Type.Type.Type.Type.Type.Type.self
 

Ces constructions ont-elles un sens? Si SomeClass.Type.Type n'est pas un objet, qu'est-ce que c'est et pourquoi pouvons-nous le déclarer?

9voto

JAL Points 3432

Si SomeClass.Type.Type n'est pas un objet, qu'est-ce et pourquoi nous en mesure de le déclarer?

Je vais essayer de décortiquer ce que vous demandez.

SomeClass.Type.Type est un Metatype d'un Metatype. Metatypes existent dans de Swift parce que Swift a des types qui ne sont pas des classes. C'est le plus semblable à la Métaclasse concept en Objective-C.

Lexique.tvd dans la Swift Open Source Repo a une très bonne explication:

metatype

Le type d'une valeur représentant un type. Greg Parker a une bonne explication de l' Objective-C est "metaclasses" parce que Swift a des types que sont pas des classes, un terme plus général qui est utilisé.

Nous avons aussi parfois référence à une valeur représentant un type comme un "metatype objet" ou tout simplement "metatype", généralement dans les bas-niveau des contextes comme IRGen et LLDB. C'est techniquement incorrect (c'est juste un "type d'objet"), mais le malapropism qui s'est passé au début du projet et a collé autour.

Pourquoi sommes-nous en mesure de déclarer un type de type de type... et ainsi de suite? Parce que c'est une caractéristique de la langue appelée métadonnées de type:

type de métadonnées

L'exécution de la représentation d'un type, et tout ce que vous pouvez faire avec lui. Comme un Class en Objective-C, mais pour n'importe quel type.

Notez que vous ne pouvez pas faire quelque chose comme NSObject().class en Swift, car class est un mot clé réservé pour la création d'une classe. Voici comment vous pouvez obtenir le type (ou la classe dans ce cas) d'une NSObject dans Swift:

let nsObj = NSObject()
nsObj.classForCoder // NSObject.Type
nsObj.classForKeyedArchiver // NSObject.Type
nsObj.dynamicType // NSObject.Type

Notez que nsObj et nsObj.self sont identiques et représentent l'instance de l' NSObject.

Je ne vois pas où dans le Swift module ou open source repo où les types de .Type, mais je suis toujours à la recherche. Il pourrait avoir à faire avec l'héritage de SwiftObject, l'Objective-C objet de toutes les Swift classes héritent de (au moins sur Mac).

0voto

Ananth Points 138

Le type d'une classe est également représenté en mémoire (il a par exemple leurs propres méthodes). Il est représenté par un singleton représentant le type. (Ce n'est pas une instance de ce type - c'est quelque chose de différent). Si vous appelez self sur un type comme celui-ci SomeClass.self, vous prendrez une instance singleton représentant le type SomeClass.

Pour plus d'informations, vérifiez cette réponse

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