¿Qué es la despacho?
sobes.tech AI
Respuesta de la IA
La despacho es el proceso de determinar qué método o función específica se ejecutará durante la ejecución del programa.
En Swift, existen tres tipos principales de despacho:
-
Estático (Despliegue estático o directo): El más rápido. El compilador sabe exactamente qué método será llamado en tiempo de compilación. No hay costos adicionales para buscar el método. Se aplica a:
- Estructuras (struct).
- Enumeraciones (enum).
- Métodos en clases marcados como
finaloprivate(si no hay@objcy no se usa despacho dinámico a través del runtime de Objective-C). - Funciones globales y estáticas.
- Extensiones (extension).
-
Tabular (Despacho de tabla): Se usa para clases. Se crea una tabla virtual (vtable) para cada clase, que contiene punteros a las implementaciones de los métodos. Al llamar a un método, se busca el puntero en la tabla. Tiene costos adicionales menores. Se aplica a:
- Métodos de instancia de clases (métodos de clase), no marcados como
finaloprivate. - Propiedades calculadas (computed properties).
class Animal { func speak() { // Despacho de tabla print("...") } } class Dog: Animal { override func speak() { // Método sobrescrito, también despacho de tabla print("Woof") } } - Métodos de instancia de clases (métodos de clase), no marcados como
-
Dinámico (Despacho dinámico): El más lento. La resolución del método ocurre en tiempo de ejecución a través del runtime de Objective-C. Se usa para interactuar con Objective-C. Tiene costos significativos. Se aplica a:
- Métodos marcados como
@objc dynamic. - Propiedades marcadas como
@objc dynamic. - Observación de valor clave (KVO).
- Codificación de valor clave (KVC).
class SomeClass: NSObject { @objc dynamic func performAction() { // Despacho dinámico print("Performing action") } } - Métodos marcados como
Tabla resumen:
| Tipo | Velocidad | Costos adicionales | Dónde se aplica |
|---|---|---|---|
| Estático | Alto | Bajos | Struct, Enum, métodos final/private en clases, extensión |
| Tabular | Medio | Medios | Métodos de instancia de clases (no final/private) |
| Dinámico | Bajo | Altos | @objc dynamic |
La elección del tipo de despacho es importante para optimizar el rendimiento. Swift selecciona por defecto el tipo más eficiente que permite mantener la flexibilidad del polimorfismo donde sea necesario (usando despacho tabular para clases). El uso de final o private puede ayudar al compilador a aplicar despacho estático.