Una guía paso a paso para convertir una aplicación completa de Objective-C a Swift

Publicado: 2018-03-14

Desde su lanzamiento en 2014, el lenguaje de programación Swift de Apple ha experimentado un crecimiento fenomenal. El lenguaje de programación ha logrado hacerse un lugar en la tarea del Top 10 de lenguajes de programación , compartiendo la posición con su antecesor, Objective-C. Pero la guerra entre Swift y Objective-C nunca se suaviza.

Con este aumento de popularidad y funciones interesantes, muchos desarrolladores de aplicaciones iOS que anteriormente trabajaban con Obj-C se cambiaron al lenguaje de programación Swift. De hecho, dentro de la lucha de Swift u Objective-C para iOS, varias aplicaciones de iOS como LinkedIn, Yahoo Weather, Hipmunk y Lyft ya se han actualizado de Objective-C a Swift, mientras que muchas planean convertir una aplicación de Objective-C. a Swift.

FACTORES QUE HACEN DE SWIFT UNA MEJOR OPCIÓN

Personalmente, he visto la evolución de Swift desde que se presentó su primera versión y puedo decir que entre Swift vs C, Swift reemplaza a Objective-C en función de factores, como

Fuente abierta

Swift es un lenguaje de código abierto y el código Swift puede ser portátil en muchas más plataformas que Objective-C.

Velocidad

El desarrollo de Swift para iOS es un lenguaje de tipo estático que funciona con el compilador LLVM y puede reutilizar el código existente, erradicar recursos no utilizados, administrar funciones en línea, etc. Además, su funcionamiento se basa en una de las aritméticas de cálculo de algoritmos más rápidas de C ++, lo que a su vez demuestra que tiene una ventaja competitiva sobre su predecesor.

Según lo que afirma Apple y yo he experimentado, el algoritmo de búsqueda de Swift es 2,6 veces más rápido que Objective-C.

Legibilidad

A diferencia de Objective-C, Swift no está vinculado a las bases de C. Permite a los desarrolladores de iOS eliminar llamadas de métodos anidados, omitir un punto y coma al final de una línea, evitar poner @ al comienzo de una palabra clave, concatenar cadenas usando el signo "+", etc. Además, la clase Swift no se divide en partes, la interfaz y la implementación. Esto redujo la longitud del código a casi la mitad, haciéndolo más legible.

Por ejemplo, cuando la aplicación Lyft se reescribió en lenguaje Swift desde cero, el código de la aplicación disminuyó de 75 000 a 25 000 líneas. Estas cifras impresionantes reducen los esfuerzos de los desarrolladores sin afectar el rendimiento de la aplicación en el extremo del cliente.

Codificación interactiva

Con su función Playgrounds, permitió a los programadores escribir un fragmento de código o algoritmo mientras recopilaban comentarios a lo largo de la fase de desarrollo. Como el código Swift se escribe usando visualizaciones de datos, esto hace que el proceso de desarrollo de aplicaciones sea más fácil y accesible.

Seguridad

Swift es un lenguaje más seguro para crear una aplicación según las tendencias actuales del mercado. Su construcción de sintaxis y lenguaje ha excluido los tipos de errores comúnmente observados al codificar en lenguaje Objective-C. Esto implica que hay menos posibilidades de bloqueo de la aplicación y casos de comportamiento problemático.

A diferencia del caso de Objective-C, el código escrito en Swift se puede compilar y los errores se pueden corregir, junto con la parte de escritura del código. Por lo tanto, Swift actúa mejor y más rápido en el proceso de prueba, en comparación con el proceso de prueba del código Objective-C.

Mantenimiento

Dado que Swift no depende de C como su predecesor, el mantenimiento en el caso del desarrollo de la aplicación Swift es mucho más fácil. Algo que convirtió a Swift en el futuro del desarrollo de aplicaciones para iOS .

En caso de crear una aplicación para iOS con Objective-C, se suponía que los desarrolladores debían mantener dos archivos de código distintos para aumentar el tiempo de creación y la eficiencia del código. Sin embargo, Swift eliminó este mecanismo de dos archivos y fusionó el encabezado de Objective-C (.h) y los archivos de implementación (.m) en un solo archivo (.swift). El compilador LLVM descubre automáticamente las dependencias mientras lee el archivo Swift, lo que es un gran beneficio para los desarrolladores de aplicaciones de iOS.

Además de los factores mencionados anteriormente, el beneficio que vale la pena mencionar de elegir Swift sobre otro lenguaje de programación de Apple es su compatibilidad con Objective-C. Apple ha ofrecido a los desarrolladores de aplicaciones la posibilidad de utilizar ambos idiomas en el mismo proyecto. Esto no solo es útil en el caso de desarrollar una aplicación iOS usando Swift desde cero, sino también para actualizar su aplicación existente a Swift usando código Objective-C.

Si bien ahora está familiarizado con las diferencias filosóficas entre los dos lenguajes de desarrollo de aplicaciones de iOS, pasemos a las diferencias durante la implementación práctica.

SWIFT VS OBJECTIVE-C: PRINCIPALES DIFERENCIAS ENTRE LOS TITANES DEL DESARROLLO IOS

Con mi experiencia con la base de código compleja de Objective-C y la base de código de Swift, encontrará varias actualizaciones de los conceptos existentes junto con una introducción a varios elementos nuevos que hacen que el proceso de desarrollo de la aplicación sea rápido. Sin hacer un preámbulo, echemos un vistazo a todo lo que encontrarás nuevo/diferente en la guerra de Swift vs Objective c.

Opcionales

Cuando hablamos del rendimiento de Swift frente a Objective-C, podemos llamar a métodos en objetos nulos para obtener un valor cero en Obj-C. Tenemos que realizar verificaciones nulas manualmente para comprender el comportamiento indefinido en caso de un valor nulo inesperado. Sin embargo, este problema se puede resolver utilizando Opcional, un nuevo concepto introducido en el código Swift. Opcional permite funciones que podrían no ser capaces de devolver un valor significativo para devolver un valor encapsulado en un opcional o nulo.

La sintaxis de declarar tipo opcional es:

Enumeración pública Opcional<Envuelto> :_Reflectable, NilLiteralConvertible

En la práctica, puede tener un valor de tipo Wrapped o un valor inexistente.

Swift hace que el azúcar sintáctico para declarar tipos sea opcional, por lo que podemos reemplazar Optional<String> con String?

Existen principalmente dos formas de obtener valor envuelto del contenedor opcional:

Encadenamiento opcional: se usa en el caso en que la declaración condicional if-let recibirá un valor solo si existe.
Ajuste forzado: se utiliza cuando la variable declarada opcional no es nula. Si el valor existe, proporcionará la salida sin implementar condiciones. Pero, en el otro caso, se bloqueará.
¡También podemos encontrar opcionales implícitamente desenvueltos en lenguaje Swift, declarados como String!

Por ejemplo:

Clase XClase

{

var unaCadena: Cadena

var bString: ¡Cadena!

var cString: ¿Cadena?

Inicial (cadena: Cadena)

{

unaCadena = cadena

}

}

Aquí,

Una cadena nunca puede ser nula. Es crucial que esta variable tenga un valor durante la inicialización del objeto, de lo contrario, el programa se bloqueará.
La cadena B puede ser nula. Sin embargo, si intenta acceder al objeto nulo, el programa fallará.
C String puede ser nulo y se supone que debe tratarse como una variable opcional regular.
Extensiones
Las extensiones y categorías que se encuentran en Obj-C se consolidan en una sola entidad, extensiones en lenguaje Swift. Las extensiones agregan nueva funcionalidad a una clase, enumeración, estructura o protocolo ya existente, y la mejor parte es que no necesita tener acceso al código fuente original para extender los tipos.

tuplas
Además de Opcionales, otro nuevo tipo de datos introducido en el nuevo lenguaje de desarrollo de Apple es Tuples. Las tuplas (tipo de datos definido por el usuario en su lugar) se consideran básicamente para agrupar muchos valores en un solo grupo compuesto. Es el elemento correcto a tener en cuenta si cree que crear un modelo en un lugar podría ser excesivo y el diccionario no es lo suficientemente fácil de leer. Para conocer más Tuplas, consulte este blog .

Genéricos
Los genéricos son una de las características más llamativas del lenguaje de programación Swift y, de hecho, gran parte de las bibliotecas estándar de Swift se crean con código Swift. El código genérico permite a los desarrolladores escribir funciones y tipos flexibles y reutilizables que pueden funcionar con diferentes conjuntos de tipos, sujetos a los requisitos definidos. Esto minimiza el riesgo de duplicación y mejora la legibilidad del código con un enfoque claro y abstracto.

Según mi experiencia, los genéricos son difíciles de obtener al principio, al igual que las recursiones. Pero, cuando lo tenga en sus manos, podrá desenredar un mundo completamente nuevo de solucionar problemas lógicos aburridos.

Enumeración
En código Objective-C, las enumeraciones están restringidas a tipos primitivos. Para asignar valores de enumeración de enteros a los de las cadenas para mostrar la salida, debe introducir una matriz o girar hacia la estructura de control del interruptor. Sin embargo, no necesita pasar por estas molestias con el lenguaje de desarrollo de aplicaciones Swift iOS.

Swift ofrece nuevas enumeraciones variadas con más opciones. Las enumeraciones Swift pueden tener valores asociados y el caso de enumeración Swift puede contener un conjunto predefinido de campos. De hecho, las enumeraciones de Swift pueden ser recursivas y pueden almacenar valores sin procesar.

Por ejemplo:
codigos

Subíndices
Los subíndices pueden verse como un medio para acceder a la información de una secuencia, colección o lista en clases, enumeraciones y estructuras sin usar un método. Puede considerar subíndices para establecer y recuperar valores por índice sin crear métodos separados para almacenar y recuperar. Por ejemplo, puede acceder a elementos en una instancia de Array como someArray[index] y elementos en una instancia de Dictionary como someDictionary[key].

La sintaxis para declarar un subíndice es la siguiente:

subíndice (índice: Int) -> Int {

obtener {

//para declarar el valor del subíndice

}

establecer (nuevoValor) {

//para definir valores

}

}

Inferencia de tipo

Swift también propuso la seguridad de tipos para el desarrollo de aplicaciones de iOS, según la cual una variable cuando se declara con un tipo particular, su tipo será estático e inmutable. El compilador determinará (o inferirá) de qué tipo será su variable en función de los valores que asigne.

Por ejemplo:

código 1
Aquí, el compilador mostrará un error cuando intente inicializar con valores numéricos a una variable str2 (ver más abajo)

codigo 03

Funciones
La sintaxis de la función en el lenguaje de programación Swift es más flexible de definir que en el complejo estilo de código Objective-C. En Swift, cada función tiene un tipo que se compone de los tipos de parámetros de la función y devuelve el tipo, lo que implica que puede asignar funciones a una variable o pasarla como valor a otras funciones (como se muestra en el siguiente ejemplo):

imagen de codigo

Aparte de esto, Swift también permite que los desarrolladores de aplicaciones definan valores predeterminados para parámetros funcionales.

Manejo de errores
Swift ofrece un enfoque completamente nuevo para lanzar, atrapar, hacer circular y manipular errores recuperables en tiempo de ejecución. Para obtener una idea del manejo de errores en Swift, consulte el blog.

Además de estos, varios conceptos que hacen que el desarrollo de aplicaciones Swift sea beneficioso para todos sobre el desarrollo de aplicaciones Objective-C son:

Modelos
En el caso de Swift, se prefiere que los modelos sean estructuras en lugar de clases.

Protocolos
En el primero de los videos de la WWDC de Apple, Swift se presentó como un "lenguaje orientado a protocolos". Un protocolo se puede definir como un modelo de métodos, propiedades y otras entidades que se adaptan a una tarea/función en particular. Pueden ser adoptados por una clase, enumeración o estructura para facilitar una implementación real de esos requisitos, y son mucho más poderosos en comparación con Obj C con las características de proporcionar implementaciones predeterminadas, incorporar genéricos, etc.

Como desarrollador de aplicaciones iOS, prefiero crear un protocolo antes de definir una clase como la práctica más eficaz para aprovechar los beneficios del lenguaje de programación avanzado de Apple.

Enfoque de programación funcional
Swift permite a los desarrolladores usar más enfoques funcionales para resolver problemas mundanos que emplear bucles tradicionales o tipos de referencias. Aquí, la perspectiva es analizar un problema en términos de cuál es la solución, en lugar de determinar cómo obtener la solución como se hace en el enfoque tradicional.

Desde mi experiencia con ambos lenguajes de iOS, una cosa que noté es que lo que estábamos haciendo mediante iteraciones usando bucles for en Objective-C se puede hacer usando el concepto de Filtro, Mapa y Reducción en Swift. Para obtener información detallada sobre estas funciones de orden superior en la programación funcional, consulte el blog.

GUÍA PASO A PASO PARA CONVERTIR UNA APLICACIÓN COMPLETA DE OBJECTIVE-C A SWIFT

Hoy en día, existen varias herramientas para convertir una aplicación de Objective-C a Swift línea por línea. Sin embargo, aconsejo no usar ninguno. Aunque ambos lenguajes de iOS son interoperables, sus paradigmas de programa son diferentes. Migrar una aplicación de Obj-C a Swift directamente traerá un mayor riesgo de usar paradigmas incorrectos. Permítanme elaborar sobre esto.

Swift, a diferencia de su predecesor, está influenciado por el paradigma de la programación funcional, lo que hace que dependa en gran medida de la inmutabilidad. Por ejemplo, si habla de matrices y diccionarios, estos modelos básicos se utilizan para ser un tipo de referencia en Objective-C, pero son un tipo de valor en Swift, por lo que son inmutables. Esto implica que convertir el código Obj-C a Swift inconscientemente usando cualquier herramienta hará que te enfrentes a muchos errores que son difíciles de depurar. Además, Swift tiene toneladas de nuevas funciones (como ya se describió anteriormente) que hacen que los algoritmos/enfoques sean más eficientes y los programas se realicen rápidamente. De hecho, es la razón principal por la que Apple presentó un nuevo lenguaje en lugar de actualizar Obj-C. Con todos estos puntos en consideración, recomiendo a todos que escriban una nueva aplicación en Swift desde cero en lugar de realizar una conversión línea por línea de Obj-C a Swift.

Aún así, si desea convertir una aplicación completa de Objective-C a Swift, una herramienta que puede usar es Swiftify. La herramienta facilita el proceso de actualización del código Obj-C al nuevo lenguaje de programación de Apple con un solo clic; ahorrando miles de horas de trabajo. La función de interoperabilidad permite integrar el código iOS convertido de nuevo a Objective-C sin ningún problema, lo que implica que puede explorar la gran cantidad de opciones que ofrece Swift y luego, integrarlo nuevamente en su proyecto Obj-C sin tener que volver a escribir todo a la vez.

Prepare el código de su aplicación existente para la conversión
Siempre es mejor comenzar con el último código Obj-C. Esto se debe a que Xcode cuenta con un convertidor de Objective-C moderno que puede ayudarlo con:

1. Cambiar id a tipo de instancia siempre que sea posible
2. Empleando las macros de enumeración correctas
3. Actualización a la sintaxis @property más reciente

Si bien el convertidor ayuda con la mecánica de analizar y aplicar alteraciones potenciales, no representa la semántica del código. Por lo tanto, es recomendable que todos los desarrolladores de aplicaciones de iOS revisen todo manualmente una vez y luego confirmen los cambios.

Para usar el convertidor, seleccione Editar -> Refactorizar -> Cambiar a sintaxis moderna de Objective-C.

El proceso de Migración de código Objective-C a Swift
El enfoque más eficaz para convertir una aplicación completa de Objective-C a Swift es, para empezar, una clase a la vez, especialmente una clase sin ninguna subclase, ya que no puede subclasificar las clases de Swift en Obj-C.

Reemplace los archivos .m y .h relacionados con la clase con un solo archivo .swift. Con esto, todo, desde la interfaz hasta la implementación, entrará automáticamente en el archivo Swift. Además, no necesita crear un archivo de encabezado, ya que Xcode genera automáticamente un encabezado, si es necesario.

Diseño de un archivo de encabezado puente
Cuando agregue su primer archivo .swift, encontrará un mensaje como el que se muestra a continuación.

código rápido12

Haga clic en la opción ' Crear encabezado puente '.

Una guía paso a paso

1. Elija un par de archivos .h y .m que desee convertir a Swift. Si desea convertir todo el proyecto, deje la clase AppDelegate para más tarde.
2. Busque #import "MyViewController.h" en todo el código y elimínelo del archivo de encabezado de Objective-C Bridging ([MyProject]-Bridging-Header.h).
3. Reemplace las instancias de #import “[nombre de archivo].h” con #import “[MiProyecto]-Swift.h” en todos los archivos .m y coloque @class [nombre de archivo] en lugar de #import “[nombre de archivo].h” en todos los archivos .h.
4. Transforme la parte de los archivos Obj-C a Swift. Esto se puede hacer fácilmente usando la extensión Finder de 'Swiftify for Xcode'. De lo contrario, copie el contenido de los archivos .m y .h en .swift y use la opción "Convertir archivo a Swift" disponible en Swiftify Xcode Extension.
5. Reemplace los archivos .h y .m con archivos .swift convertidos en el proyecto.
6. Compile el proyecto y corrija los errores de conversión. Si bien muchos problemas se gestionarán fácilmente con las sugerencias de corrección automática de Xcode, también puede confiar en Swiftify para informar y corregir los errores que aparecen varias veces en el proyecto.
7. Una vez hecho esto, compila y ejecuta el proyecto. Si surge el problema de 'Clase no encontrada' seguida de bloqueo, busque todas las referencias en el Editor de guiones gráficos. Vuelva a ingresar el nombre de la clase en el Inspector de identidad, guárdelo y vuelva a intentarlo.
8. Si está convirtiendo todo el proyecto, puede transformar la clase AppDelegate ahora. En este punto, todos los demás archivos se han convertido a Swift y, por lo tanto, si no quedan archivos Obj-C en el destino, puede eliminar fácilmente el archivo main.m y .pch (encabezado precompilado).

¿Qué práctica prefiere: crear una nueva aplicación de iOS en Swift desde cero o convertir completamente Objective-C a Swift? Comparta sus puntos de vista a través de la sección de comentarios a continuación.