Reflejo y espejo
/* Reflection y Mirror Reflection en Java es una característica que detecta, accede o modifica el comportamiento de un tipo en tiempo de ejecución. La estructura de los tipos de lenguaje estático general y las llamadas a métodos se determinan en el momento de la compilación. En muchos casos, lo que los desarrolladores pueden hacer es simplemente usar el flujo de control (si, cambiar) para decidir qué configuraciones realizar o qué método llamar. La función de reflexión nos permite tener la oportunidad de llamar a métodos en tiempo real a través de ciertas condiciones durante la ejecución, o incluso establecer dinámicamente o incluso agregar propiedades y métodos a un determinado tipo. Esta es una característica de lenguaje muy flexible y poderosa. Palabras como "reflexión" no se mencionan a menudo en Objective-C porque el tiempo de ejecución de Objective-C es más flexible y poderoso que la reflexión ordinaria. Por ejemplo, NSClassFromString, @selector("methodName") Swift ha abandonado la parte de tiempo de ejecución de Object-C y sus funciones son mucho más débiles, pero también hay contenidos relacionados con la reflexión. Ahora la conversión implícita debe usar la "conversión literal". método para reflejar Mirror*/struct Persion { let name: String let age: Int}let xiaoMing = Persion(name: "XiaoMing", age: 16)// r es MirrorType, Mirror for Persionlet r = Mirror(reflecting: xiaoMing) print(" xiaoMing es\(r.displayStyle)") // "xiaoMing es opcional(struct)"print("Número de atributos:\(r.children.count)")para niño en r.children { print(" Nombre del atributo: \(child.label), valor: \(child.value)")}/* Número de atributos: 2 Nombre del atributo: Opcional ("nombre"), valor: XiaoMing Nombre del atributo: Opcional ("edad") , valor: 16 *//* Las descripciones de los elementos contenidos en los resultados obtenidos mediante la inicialización de Mirror se recopilan bajo el atributo Children, que es una colección de Child. ¿Es una tupla de un par de valores clave públicos Child =? (etiqueta: Cadena?, valor: Cualquiera) public typealias Children = AnyCollection Cabe señalar que
Este valor puede ser una secuencia anidada compuesta de múltiples elementos. Por ejemplo, si el valor del atributo es una matriz o. diccionario, es una forma anidada
Para un Espejo reflejado desde un objeto, la información que contiene es completa. Es decir, podemos usar Mirror para comprender la información de atributos de una instancia de un tipo Swift (también se puede usar la clase NSObject) en tiempo de ejecución.
Aplicación 1:
Cualquier objeto modelo genera la descripción json correspondiente. Se puede realizar un acceso en profundidad a los valores Mirror que esperan ser procesados y se pueden clasificar en diferentes formatos según el tipo de valor del atributo.
Aplicación 2:
Realice valueForKey: en objetos rápidos como en Object-C. Simplemente compare el nombre del atributo obtenido con el valor clave que queremos obtener primero.
*/
func valueFromA(_ object: Any, key: String) -> Any? {
let mirror = Mirror(reflectante: objeto)
for child in mirror.children {
let (targetKey, targetMirror) = (child.label, child.value)
if key == targetKey {
devuelve targetMirror
}
}
devuelve nil
}
// Prueba
if let name = valueFromA(xiaoMing, key: "name") as? String {
print("Obtener el valor a través de la clave: \(name)") p >
}
/*
Cabe señalar que Mirror aún no es estable, así que evite aplicarlo al desarrollo real
*/