0
Swift’s migration. The true
Story
Miguel Olmedo Camacho
@molmedoc
Enrique Fau de Casa-Juana
@kikefau
1
2
Motivaciones
3
Motivaciones
4
¿Por qué?
● Nuevo lenguaje
● Sintaxis moderna
● Más rápido
● Fuertemente tipado
● Genéricos
● Enfoque funcional
● Closures VS Blocks
● Refactor (Legacy code)
Motivaciones
5
Punto de partida
6
● Aplicación nativa (universal)
● iOS >= 6
● ≃ 1.000 ficheros
● ≃ 140.000 líneas de código
● 12 bibliotecas de terceros (pods)
● Poco modularizada
● Deuda técnica
Punto de partida
7
El Camino
8
Estrategia de
migración
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
10
El comienzo
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
12
Primeros problemas
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)
14
Primeros problemas
15
Siguientes pasos:
Xcode 6.3
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)
17
Siguientes pasos (XCode 6.3)
18
Xcode 7 - Swift 2
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
20
Xcode 8 - Swift 3
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)
22
Swift 3 (XCode 8 - Swift 3)
23
24
Estructuras / Enumerados
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
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
27
28
29
30
Blocks vs Closures
31
● Sintaxis poco intuitiva
Bloques
Blocks vs Closures
32
Bloques
Blocks vs Closures
http://fuckingblocksyntax.com/
33
● Sintaxis poco intuitiva
● Poco extendido su uso
● En tareas asíncronas, se usan más los
delegados que los bloques
Bloques
Blocks vs Closures
34
● Sintaxis mucho más natural, como si
declarases métodos
Closures
Blocks vs Closures
35
Bloques
Blocks vs Closures
http://fuckingclosuresyntax.com/
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
37
38
39
40
41
42
43
44
VIPER
45
Definición
VIPER
46
Frameworks dinámicos
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
48
Programación
orientada a protocolos
49
Ejemplo
Programación orientada a protocolos
50
Ejemplo
Programación orientada a protocolos
51
52
53
54
55
56
57
Consejos
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
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
60
Libros y enlaces
61
Para aprender Swift
● https://itunes.apple.com/es/book/swift-programming-language/id881256329?mt=11
● https://itunes.apple.com/es/book/using-swift-cocoa-objective/id888894773?mt=11
● https://itunes.apple.com/es/course/developing-ios-9-apps-swift/id1104579961?l=en
Swift avanzado
● https://www.objc.io/books/advanced-swift/
Programación funcional con Swift
● https://www.objc.io/books/functional-swift/
● https://www.raywenderlich.com/114456/introduction-functional-programming-swift
● https://realm.io/news/altconf-chris-eidhof-functional-programming-in-swift/
Protocol oriented programming
● https://developer.apple.com/videos/play/wwdc2015/408/
● https://developer.apple.com/videos/play/wwdc2016/419/
● https://realm.io/news/appbuilders-natasha-muraschev-practical-protocol-oriented-
programming/
● https://realm.io/news/doios-natasha-murashev-protocol-oriented-mvvm/
● http://krakendev.io/blog/subclassing-can-suck-and-heres-why
● https://speakerdeck.com/jessesquires/pushing-the-limits-of-protocol-oriented-programming
● https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2
● https://www.natashatherobot.com/protocol-oriented-views-in-swift/
● https://www.natashatherobot.com/protocol-oriented-networking-in-swift/
Libros y enlaces
62
Nuevas funcionalidades en Swift 3
● https://github.com/apple/swift-evolution/blob/master/releases/swift-3_0.md
Bugs
● http://stackoverflow.com/questions/28476030/xcode-keeps-building-storyboard-after-each-
keystroke
● https://forums.developer.apple.com/thread/43445
● https://forums.developer.apple.com/thread/62737
VIPER
● https://www.objc.io/issues/13-architecture/viper/
● https://github.com/mutualmobile/VIPER-SWIFT
Value Types
● https://realm.io/news/andy-matuschak-controlling-complexity/
● https://www.objc.io/issues/16-swift/swift-classes-vs-structs/
● https://www.raywenderlich.com/112027/reference-value-types-in-swift-part-1
● https://developer.apple.com/swift/blog/?id=10
63
Gracias!!
Miguel Olmedo Camacho
@molmedoc
Enrique Fau de Casa-Juana
@kikefau
64
¿Preguntas?
Miguel Olmedo Camacho
@molmedoc
Enrique Fau de Casa-Juana
@kikefau

Swift migration. the true history

  • 1.
    0 Swift’s migration. Thetrue Story Miguel Olmedo Camacho @molmedoc Enrique Fau de Casa-Juana @kikefau
  • 2.
  • 3.
  • 4.
  • 5.
    4 ¿Por qué? ● Nuevolenguaje ● Sintaxis moderna ● Más rápido ● Fuertemente tipado ● Genéricos ● Enfoque funcional ● Closures VS Blocks ● Refactor (Legacy code) Motivaciones
  • 6.
  • 7.
    6 ● Aplicación nativa(universal) ● iOS >= 6 ● ≃ 1.000 ficheros ● ≃ 140.000 líneas de código ● 12 bibliotecas de terceros (pods) ● Poco modularizada ● Deuda técnica Punto de partida
  • 8.
  • 9.
  • 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
  • 11.
  • 12.
    11 ● Creamos nuestroprimer 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
  • 13.
  • 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)
  • 15.
  • 16.
  • 17.
    16 ● Nulabilidad desdeObjc ● 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)
  • 18.
  • 19.
    18 Xcode 7 -Swift 2
  • 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
  • 21.
    20 Xcode 8 -Swift 3
  • 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)
  • 23.
    22 Swift 3 (XCode8 - Swift 3)
  • 24.
  • 25.
  • 26.
    25 Estructuras ● Inmutabilidad o Daseguridad ● 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 solovalen para representar valores disjuntos o Pueden tener lógica propia ● Valores asociados ● Muchos usos o View models, remote config, proveedores de login... Estructuras / Enumerados
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
    31 ● Sintaxis pocointuitiva Bloques Blocks vs Closures
  • 33.
  • 34.
    33 ● Sintaxis pocointuitiva ● Poco extendido su uso ● En tareas asíncronas, se usan más los delegados que los bloques Bloques Blocks vs Closures
  • 35.
    34 ● Sintaxis muchomás natural, como si declarases métodos Closures Blocks vs Closures
  • 36.
  • 37.
    36 ● Sintaxis másnatural ● 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
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
    47 ● Nos sirvepara 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
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
    58 ● Poco apoco, 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 decompilación) Derived data en RAM Pods y workspace al Git Pods privados Swift Whole Module Optimization Xfrontend -debug-time- function-bodies
  • 61.
  • 62.
    61 Para aprender Swift ●https://itunes.apple.com/es/book/swift-programming-language/id881256329?mt=11 ● https://itunes.apple.com/es/book/using-swift-cocoa-objective/id888894773?mt=11 ● https://itunes.apple.com/es/course/developing-ios-9-apps-swift/id1104579961?l=en Swift avanzado ● https://www.objc.io/books/advanced-swift/ Programación funcional con Swift ● https://www.objc.io/books/functional-swift/ ● https://www.raywenderlich.com/114456/introduction-functional-programming-swift ● https://realm.io/news/altconf-chris-eidhof-functional-programming-in-swift/ Protocol oriented programming ● https://developer.apple.com/videos/play/wwdc2015/408/ ● https://developer.apple.com/videos/play/wwdc2016/419/ ● https://realm.io/news/appbuilders-natasha-muraschev-practical-protocol-oriented- programming/ ● https://realm.io/news/doios-natasha-murashev-protocol-oriented-mvvm/ ● http://krakendev.io/blog/subclassing-can-suck-and-heres-why ● https://speakerdeck.com/jessesquires/pushing-the-limits-of-protocol-oriented-programming ● https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2 ● https://www.natashatherobot.com/protocol-oriented-views-in-swift/ ● https://www.natashatherobot.com/protocol-oriented-networking-in-swift/ Libros y enlaces
  • 63.
    62 Nuevas funcionalidades enSwift 3 ● https://github.com/apple/swift-evolution/blob/master/releases/swift-3_0.md Bugs ● http://stackoverflow.com/questions/28476030/xcode-keeps-building-storyboard-after-each- keystroke ● https://forums.developer.apple.com/thread/43445 ● https://forums.developer.apple.com/thread/62737 VIPER ● https://www.objc.io/issues/13-architecture/viper/ ● https://github.com/mutualmobile/VIPER-SWIFT Value Types ● https://realm.io/news/andy-matuschak-controlling-complexity/ ● https://www.objc.io/issues/16-swift/swift-classes-vs-structs/ ● https://www.raywenderlich.com/112027/reference-value-types-in-swift-part-1 ● https://developer.apple.com/swift/blog/?id=10
  • 64.
  • 65.