Swift LanguageMétodo Swizzling


Observaciones

Cuando use Swizzling de métodos en Swift, hay dos requisitos que sus clases / métodos deben cumplir:

  • Tu clase debe extender NSObject
  • Las funciones que desea cambiar deben tener el atributo dynamic

Para obtener una explicación completa de por qué se requiere esto, consulte Uso de Swift con Cocoa y Objective-C :

Requerir el envío dinámico

Si bien el atributo @objc expone su Swift API al tiempo de ejecución de Objective-C, no garantiza el envío dinámico de una propiedad, método, subíndice o inicializador. El compilador Swift aún puede desvirtualizar o acceder a los miembros en línea para optimizar el rendimiento de su código, sin pasar por el tiempo de ejecución de Objective-C . Cuando marca una declaración de miembro con el modificador dynamic , el acceso a ese miembro siempre se despacha dinámicamente. Debido a que las declaraciones marcadas con el modificador dynamic se envían utilizando el tiempo de ejecución de Objective-C, se marcan implícitamente con el atributo @objc .

Requerir el envío dinámico rara vez es necesario. Sin embargo, debe usar el modificador dynamic cuando sepa que la implementación de una API se reemplaza en tiempo de ejecución . Por ejemplo, puede usar la función method_exchangeImplementations en el tiempo de ejecución de Objective-C para intercambiar la implementación de un método mientras se ejecuta una aplicación. Si el compilador Swift incorporara la implementación del método o el acceso desvirtualizado a él, la nueva implementación no se usaría .

Campo de golf

Referencia en tiempo de ejecución de Objective-C

Método Swizzling en NSHipster

Método Swizzling Ejemplos relacionados