Swift soutient-il la réflexion? Existe-t-il quelque chose comme valueForKeyPath:
et setValue:forKeyPath:
pour les objets Swift?
En fait, a-t-il même un système de type dynamique, quelque chose comme obj.class
en Objective-C?
ios
reflection
swift
Khanh Nguyen
la source
la source
Réponses:
On dirait qu'il y a le début d'un support de réflexion:
De mchambers gist, ici: https://gist.github.com/mchambers/fb9da554898dae3e54f2
la source
Mirror
cite le motIDE
plusieurs fois._stdlib_getTypeName
peut vous aider.Si une classe s'étend
NSObject
, alors toute l'introspection et le dynamisme d'Objective-C fonctionnent. Ceci comprend:Un inconvénient de cette fonctionnalité est la prise en charge des types de valeur optionnels Swift. Par exemple, les propriétés Int peuvent être énumérées et modifiées mais Int? les propriétés ne peuvent pas. Les types facultatifs peuvent être énumérés partiellement à l'aide de Reflect / MirrorType, mais toujours pas modifiés.
Si une classe ne s'étend pas
NSObject
, alors seule la nouvelle réflexion très limitée (et en cours?) Fonctionne (voir refléter / MirrorType), ce qui ajoute une capacité limitée à demander à une instance sa classe et ses propriétés, mais aucune des fonctionnalités supplémentaires ci-dessus .Lorsqu'il n'étend pas NSObject ou n'utilise pas la directive '@objc', Swift utilise par défaut une distribution basée sur statique et vtable. Ceci est plus rapide, cependant, en l'absence d'une machine virtuelle ne permet pas l'interception de méthode d'exécution. Cette interception est une partie fondamentale de Cocoa et est requise pour les types de fonctionnalités suivants:
Par conséquent, il est recommandé que les classes dans les applications Cocoa / CocoaTouch implémentées avec Swift:
Résumé:
Données de référence: surcharge d'exécution pour les appels de méthode:
(les performances réelles dépendent du matériel, mais les ratios resteront similaires).
De plus, l'attribut dynamic nous permet d'indiquer explicitement à Swift qu'une méthode doit utiliser la répartition dynamique et prendra donc en charge l'interception.
la source
La documentation parle d'un système de type dynamique, principalement
Type
etdynamicType
Voir Type de métatype (dans Référence du langage)
Exemple:
En supposant maintenant
TestObject
s'étendNSObject
Actuellement, aucune réflexion n'est mise en œuvre.
EDIT: J'avais apparemment tort, voir la réponse de stevex. Il existe une réflexion simple en lecture seule pour les propriétés intégrées, probablement pour permettre aux IDE d'inspecter le contenu des objets.
la source
Il semble qu'une API de réflexion Swift ne soit pas une priorité pour Apple pour le moment. Mais en plus de la réponse @stevex, il existe une autre fonction dans la bibliothèque standard qui aide.
À partir de la version bêta 6,
_stdlib_getTypeName
obtient le nom de type mutilé d'une variable. Collez ceci dans un terrain de jeu vide:La sortie est:
L'entrée de blog d'Ewan Swick aide à déchiffrer ces chaînes:
par exemple
_TtSi
représente leInt
type interne de Swift .Mike Ash a une excellente entrée de blog sur le même sujet .
la source
Vous voudrez peut-être envisager d'utiliser toString () à la place. Il est public et fonctionne de la même manière que _stdlib_getTypeName () à la différence qu'il fonctionne également sur AnyClass , par exemple dans un Playground, entrez
la source
Aucun
reflect
mot-clé dans Swift 5, vous pouvez maintenant utiliserla source
json
désérialisation