¿Swift admite la reflexión? por ejemplo, ¿hay algo como valueForKeyPath:
y setValue:forKeyPath:
para objetos Swift?
En realidad, ¿tiene siquiera un sistema de tipos dinámico, algo así como obj.class
en Objective-C?
ios
reflection
swift
Khanh Nguyen
fuente
fuente
Respuestas:
Parece que está el comienzo de algún apoyo de reflexión:
De mchambers gist, aquí: https://gist.github.com/mchambers/fb9da554898dae3e54f2
fuente
Mirror
realidad, Protocol cita la palabraIDE
varias veces._stdlib_getTypeName
puede ayudar.Si una clase se extiende
NSObject
, entonces toda la introspección y el dinamismo de Objective-C funcionan. Esto incluye:Una deficiencia de esta funcionalidad es la compatibilidad con los tipos de valores opcionales de Swift. Por ejemplo, las propiedades Int se pueden enumerar y modificar, pero Int? las propiedades no pueden. Los tipos opcionales se pueden enumerar parcialmente usando reflect / MirrorType, pero aún no se modifican.
Si una clase no se extiende
NSObject
, entonces solo funciona la nueva reflexión muy limitada (¿y en progreso?) (Ver reflect / MirrorType), que agrega una capacidad limitada para preguntar a una instancia sobre su clase y propiedades, pero ninguna de las características adicionales anteriores. .Cuando no se extiende NSObject, o se usa la directiva '@objc', Swift utiliza de forma predeterminada el envío basado en estática y vtable. Sin embargo, esto es más rápido, en ausencia de una máquina virtual, no permite la interceptación del método en tiempo de ejecución. Esta interceptación es una parte fundamental de Cocoa y es necesaria para los siguientes tipos de características:
Por lo tanto, se recomienda que las clases en aplicaciones Cocoa / CocoaTouch implementadas con Swift:
Resumen:
Datos de referencia: sobrecarga de ejecución para invocaciones de métodos:
(el rendimiento real depende del hardware, pero las proporciones seguirán siendo similares).
Además, el atributo dinámico nos permite instruir explícitamente a Swift de que un método debe usar envío dinámico y, por lo tanto, admitirá la interceptación.
fuente
La documentación habla de un sistema de tipos dinámicos, principalmente sobre
Type
ydynamicType
Ver tipo de metatipo (en la referencia del lenguaje)
Ejemplo:
Ahora asumiendo que se
TestObject
extiendeNSObject
Actualmente, no hay una reflexión implementada.
EDITAR: Aparentemente estaba equivocado, vea la respuesta de stevex. Hay una reflexión simple de solo lectura para las propiedades incorporadas, probablemente para permitir que los IDE inspeccionen el contenido del objeto.
fuente
Parece que una API de reflexión Swift no es una alta prioridad para Apple en este momento. Pero además de la respuesta de @stevex, hay otra función en la biblioteca estándar que ayuda.
A partir de la versión beta 6, se
_stdlib_getTypeName
obtiene el nombre de tipo alterado de una variable. Pegue esto en un patio de recreo vacío:La salida es:
La entrada del blog de Ewan Swick ayuda a descifrar estas cadenas:
por ejemplo,
_TtSi
representa elInt
tipo interno de Swift .Mike Ash tiene una excelente entrada de blog que cubre el mismo tema .
fuente
Es posible que desee considerar el uso de toString () en su lugar. Es público y funciona igual que _stdlib_getTypeName () con la diferencia de que también funciona en AnyClass , por ejemplo, en un patio de recreo.
fuente
Sin
reflect
palabra clave en Swift 5, ahora puede usarfuente
json
deserialización