El documento describe la migración de una aplicación nativa de iOS desde Objective-C a Swift. Comenzaron migrando de forma incremental, desarrollando nuevas funcionalidades en Swift y refactorizando el código existente cuando era necesario. A lo largo del proceso encontraron diversos problemas que fueron resolviendo, como la comunicación entre código Swift y Objective-C o los cambios entre versiones de Swift. Finalmente lograron migrar casi todo el proyecto a Swift y mejorar aspectos como la cobertura de tests y la estabilidad.
10. 9
Estrategia de migración
● Migración incremental
● No congelamos nuevos desarrollos
● Nuevos desarrollos en Swift
● Pair programming - Code review
● Tareas de deuda técnica
● Refactor cuando sea necesario
● Pods homólogos en Swift
12. 11
● Creamos nuestro primer fichero en Swift!
● idealista-Bridging-Header.h
o Clases de Objc que necesitan visibilidad
desde Swift
● idealista-Swift.h (compilación)
o XCode completa idealista-Swift con clases
de Swift que necesitan visibilidad desde
Objc
El comienzo
14. 13
● Comunicación Objc - Swift (IUO!)
● Crashes en tiempo de ejecución
● Dependencias Objc - Swift (Bridging header)
● El target de test incluye todos los ficheros
● If - let anidados
● Sin cláusula where
● XCode...
Primeros problemas (Swift 1)
17. 16
● Nulabilidad desde Objc
● 40% del proyecto en Swift
● VIPER
● Estructuras para el modelo
● Enumerados para el View - Model
● Aumento del “code coverage”
● Aumento “crash free users”
● Aumento de tiempos de compilación
Siguientes pasos (XCode 6.3)
20. 19
● El drama, iOS 7
o Crash en genéricos
o Imposibilidad de usar Pods en Swift
o Dejamos de dar soporte a iOS 7
● Mejoras
o Testable import
o Guard
o If - let múltiples anidados
o Cláusula where
XCode 7 - Swift 2
22. 21
● Proyecto 99,9% en Swift
● Migración automática mis co**nes
● Cambios en las firmas de los métodos
● Enumerados en minúsculas
● Comparar opcionales (Crash en runtime)
● Nuevos warnings
● Nuevos y divertidos troleos...
Swift 3 (XCode 8 - Swift 3)
26. 25
Estructuras
● Inmutabilidad
o Da seguridad
● Paso por valor vs paso por referencia
o Cada caso es distinto
● Hay que acostumbrarse a usarlo
o A veces genera más problemas que
soluciones
Estructuras / Enumerados
27. 26
Enumerados
● No solo valen para representar valores
disjuntos
o Pueden tener lógica propia
● Valores asociados
● Muchos usos
o View models, remote config, proveedores
de login...
Estructuras / Enumerados
37. 36
● Sintaxis más natural
● Trailing closure
● Parámetros / Return implícitos
● Mayor uso de closures vs delegates
● Typealias para dar semántica
● Cuidado con los ciclos de memoria
Closures
Blocks vs Closures
48. 47
● Nos sirve para desacoplar la aplicación
o Módulo de servicios, gestión de
localización del usuario, core spotlight...
● Reutilización de código
o Aplicación /Apple Watch / ¿tv OS?
● Menos conflictos durante el desarrollo
● Mejor separación de responsabilidades
Frameworks dinámicos
Frameworks dinámicos
59. 58
● Poco a poco, sin prisa
● Nuevas funcionalidades en Swift
o Sus test correspondientes también
● Mejor pasar primero a Swift el código antiguo
y crear deuda técnica que refactorizar el
código mientras se está migrando
● Apoyarse en los test
● Quitar soporte iOS 7
Consejos
60. 59
Consejos (tiempos de compilación)
Derived data en RAM
Pods y workspace al Git
Pods privados
Swift Whole Module
Optimization
Xfrontend -debug-time-
function-bodies