KMP fluido en iOS: Mejorando la experiencia con SKIE
Kotlin Multiplatform (KMP) es revolucionario para compartir lógica de negocio entre plataformas. Sin embargo, para los desarrolladores iOS que consumen este código compartido, la experiencia a veces puede sentirse extraña. Esto se debe a que KMP compila para iOS a través de la interoperabilidad con Objective-C, la cual no soporta nativamente algunas de las mejores características modernas de Kotlin (y Swift).
Aquí es donde entra SKIE (Swift Kotlin Interface Enhancer), desarrollado y mantenido por Touchlab.
Vale la pena mencionar que JetBrains está trabajando en swift-export para mejorar nativamente la experiencia de desarrollo en iOS. Sin embargo, hasta que esa funcionalidad esté lista, herramientas como SKIE son la mejor opción.
La experiencia “Vanilla” de KMP en iOS
Cuando compilas Kotlin a un framework de iOS sin herramientas como SKIE, puedes encontrar varios puntos de fricción:
- Sealed Classes: En Kotlin, las
sealed classespermiten sentenciaswhenexhaustivas. En Objective-C (y por tanto en Swift vía KMP), estas se convierten en jerarquías de clases estándar. Pierdes la capacidad del compilador para asegurar que has manejado todos los casos en unswitch. - Enums: Similar a las sealed classes, los enums de Kotlin no siempre se mapean 1-a-1 a enums de Swift con el mismo poder y flexibilidad.
- Coroutines: Las funciones
suspendde Kotlin se generan como funciones con completion handlers (callbacks) en Objective-C. Aunque Swift tieneasync/await, puentear estos callbacks manualmente es tedioso y propenso a errores. - Flows: Kotlin
Flowes una herramienta potente de procesamiento de streams. En KMP estándar, aparece como un objeto genérico, requiriendo adaptadores para ser consumido cómodamente en Swift.
Cómo SKIE mejora la experiencia del desarrollador iOS
SKIE actúa como un puente que genera código Swift amigable sobre el header de Objective-C. No cambia el compilador de Kotlin; mejora la salida.
1. Sealed Classes y Enums Exhaustivos
SKIE genera enums de Swift reales para tus sealed classes e interfaces de Kotlin. Esto significa que puedes usar la sentencia switch de Swift con chequeo exhaustivo completo.
| |
Sin SKIE, tendrías que hacer casting de tipos o chequear is, a menudo necesitando un caso default que se traga errores futuros.
2. Soporte Nativo para Async/Await
SKIE convierte automáticamente las funciones suspend de Kotlin en funciones async throws de Swift. Esto permite a los desarrolladores iOS usar el modelo de concurrencia moderno al que están acostumbrados.
| |
3. Flows como AsyncSequences
Quizás una de las características más geniales es transformar Kotlin Flow en Swift AsyncSequence. Esto te permite iterar sobre streams de datos usando un simple bucle for await.
| |
Cómo configurar SKIE
Configurar SKIE es increíblemente sencillo. Se distribuye como un plugin de Gradle.
- Abre tu
build.gradle.ktsraíz o elbuild.gradle.ktsde tu módulo compartido. - Añade el plugin SKIE al bloque
plugins:
| |
- Sincroniza tu proyecto Gradle.
¡Eso es todo! SKIE se enganchará automáticamente a la tarea de linkado de tu framework iOS y generará el código Swift mejorado.
Para configuración más avanzada, como deshabilitar features específicas o ajustar la generación de enums, puedes usar el bloque de configuración skie:
| |
Conclusión
Si estás construyendo un proyecto KMP que apunta a iOS, usar SKIE es casi obligatorio para una experiencia pulida. Respeta las diferencias de la plataforma mientras te permite compartir la máxima cantidad de lógica, manteniendo a tu equipo iOS feliz y tu codebase limpia.
