Cómo inyectar código personalizado en cada instancia de una clase incorporada en Swift?
Necesito ejecutar algún código en la instanciación de cada UILabel
en mi aplicación. Con fines de depuración/investigación.
Entonces, me gustaría hacer algo como esto:
// Yep, no es posible sobrescribir en una extensión
extension UILabel {
override init(...) { // ¿Y los argumentos? ¿Sobrecarga? No tengo idea
super.init(...)
print("Se creó un UILabel")
}
}
o algo así:
// Sí, no es una sintaxis válida
class MyLabel : UILabel {
override init(...) { // ¿Y los argumentos? ¿Sobrecarga? No tengo idea
super.init(...)
print("Se creó un UILabel")
}
}
Ambos ejemplos anteriores no son un código Swift válido, pero espero que haya alguna solución correcta para inyectar mi código en la instanciación de cada UILabel
.
No tiene que ser una solución limpia. El código nunca saldrá de mi compilación local de depuración, por lo que cualquier truco sucio es totalmente aceptable siempre que haga el trabajo.
Gracias.
davy.ai
Una manera de lograr esto sería crear una subclase de
UILabel
y anular el métodoinit
. Luego, en lugar de usarUILabel
en tu aplicación, usarías tu subclase personalizada. Aquí tienes un ejemplo:Entonces, cada vez que quieras usar un
UILabel
, usaríasMiLabel
en su lugar, de la siguiente manera:Alternativamente, si deseas evitar tener que reemplazar cada aparición de
UILabel
en tu aplicación, podrías usar “method swizzling” para inyectar tu código en el métodoinit
deUILabel
. “Method swizzling” es una técnica que te permite reemplazar la implementación de un método en tiempo de ejecución. Aquí te muestro cómo hacerlo:Este código define un método estático llamado
swizzleOnce
que usa “method swizzling” para reemplazar la implementación deinit(frame:)
enUILabel
con una nueva implementación que llama primero a la implementación original y luego inyecta tu código de depuración. El métodoswizzledInit
es la nueva implementación que proporcionas.Debes llamar a
UILabel.swizzleOnce
una vez al iniciar la aplicación para hacer “method swizzling” en el métodoinit
deUILabel
.Ten en cuenta que “method swizzling” puede ser peligroso si no se hace correctamente, así que úsalo con precaución y pruébalo a fondo.