En este post te mostraré algunas de las diferencias que existen entre usar Swift y C# para desarrollar apps en iOS. Para este post cree una app que compara dos cadenas y calcula su distancia entre ellas, hice dos versiones una tradicional y una con Xamarin.iOS. Esta es la app finalizada:

Voy a ser honesto, esta es la primera vez que uso Swift para hacer una app para iOS, sin embargo me basé por completo en la documentación de Apple para hacerla. En este caso usé Xamarin Studio 5.10.3 y Xcode 7.3

Estructura del proyecto

  1. Proyecto principal. Todo empieza con un proyecto principal, ¿cierto? en ambas opciones existe este concepto, sólo que en Xamarin existen las soluciones y en con Xcode es un único proyecto padre.
  2. Proyecto de la aplicación. en Xcode relacionamos código enfocado a una tarea mediante la creación de un grupo, en este caso para la app el grupo se llama "Xevensthein", mientras que con Xamarin o Visual Studio esta relación entre código se establece mediante la creación de un proyecto.
  3. AppDelegate. Esta clase es una de las esenciales, y como puedes ver, en ambas opciones sigue existiendo una está escrita en Swift y la otra en C#, más adelante mostraré las diferencias en el código.
  4. Main.storyboard. La interfaz gráfica se define de la misma manera para cualquiera de las dos opciones, ya sea mediante un storyboard o un archivo .xib.
  5. ViewController. Así mismo, relacionado a la interfaz y para dotar de comportamiento a nuestra app, también tenemos una clase llamada ViewController.
  6. LaunchScreen. Al ser nativas ambas, podemos usar un archivo para definir la pantalla que se muestra mientras nuestra app carga, en la plantilla de Xamarin Studio está definida en un .xib pero podríamos cambiarla por un .storyboard sin complicaciones.
  7. Recursos. Podemos usar recursos dentro de nuestra app, ya sea empaquetados en Xcode assets catalogs o como archivos individuales.
  8. Lógica de la aplicación. Si deseamos implementar lógica aparte en nuestra app, usando Swift podemos crear un framework y referenciarlo desde el proyecto de la aplicación, mientras que con C# podemos crear una biblioteca de clases, y lo mejor de todo es que esta biblioteca la podemos compartir con otras apps, como una hecha para Android, Windows 10 o inclusive una Raspberry PI.
  9. Clases. Los frameworks o bibliotecas de clases, contienen más archivos que componen la lógica de la aplicación, como dije, más adelante mostraré las diferencias en el código.

Recursos

Como ya mencioné, los recursos se manejan de manera similar, podemos importar archivos directamente a un catálogo de imágenes o añadirlos a la carpeta Resources del proyecto.

El código

AppDelegate

La clase AppDelegate es la encargada de recibir mensajes del sistema operativo y hacer que tu app responda a ellos. Como puedes ver, las diferencias son únicamente en la sintaxis, ya que en código es exactamente idéntico.

ViewController

Los ViewControllers son clases asociadas a la interfaz gráfica, a partir de las cuales se les da comportamiento a las apps. En el ejemplo de código arriba se puede ver que existen referencias a elementos de interfaz gráfica como UITextField e UIButton. Estas referencias son generadas por el constructor de interfaces y es por eso que en C# tienen los decoradores Outlet y GeneratedCode.

En C# además existe el concepto de clases parciales y Xamarin.iOS se ayuda de eso para separar la declaración de elementos de interfaz de la descripción del comportamiento.

ViewDidLoad

Dentro del ViewController existe un método llamado ViewDidLoad, el cual es el ideal para conectar los eventos y cualquier otra tarea relacionada con la vista. En este caso se asigna el ViewController como delegado de los UITextField y también se le asigna un manejador de evento al botón ComparteButton.

En Swift se usa addTarget y una serie de argumentos, mientras que en C# basta usar el operador +=.

Métodos y manejadores de evento

En cuanto a los métodos, la declaración es también idéntica aún tomando en cuenta la diferencia en la sintaxis. El decorador Foundation.Export le indica al compilador a qué método de Swift hace referencia el método de C#, pero no te preocupes, tanto Xamarin Studio como Visual Studio te ayudarán a generar ese tipo de código si no tienes mucha experiencia con iOS.

Código en general

<img src="https://thatcsharpguy.github.io/postimages/xamarin-ios/library.png" title=Código Swift & C# />

En cuanto al código en general, me atrevería a decir que la traducción entre C# y Swift no es muy complicada, basta con encontrar las equivalencias entre ellos, así como definir si las equivalencias realmente son la forma óptima de realizar la tarea. En particular a mí se me hizo un poco complicado el entender cómo acceder a los caracteres de una cadena y cómo declarar un arreglo multidimensional.

(También hice una pequeña comparativa entre Objective-C y C#).

Interfaz gráfica

Tanto Xcode como Xamarin/Visual Studio cuentan con un editor de interfaces gráficas, y como puedes observar en esta imagen, las diferencias en la superficie no son muy notorias entre ellos:

Sin embargo, y basado en mi poca experiencia, me atrevo a decir que el editor de XS o VS aún está muy lejos de la estabilidad y facilidad de uso del editor de Xcode y es por eso que, aunque estemos usando Xamarin.iOS, podemos usar el editor nativo (recuerda que con Xamarin.iOS tu app es 100% nativa) para crear la interfaz:

En conclusión

La sintaxis es una de las más grandes diferencias, sin embargo, no es muy distinta ya que me parece que Swift y C# son parecidos. Una de las diferencias más notorias es la asignación de manejadores de evento, fuera de eso la transición entre un lenguaje y otro es sencilla. Para la construcción de interfaces sorprende la capacidad de poder usar el editor de Xcode para construir la interfaz, sin necesidad de mover una sola línea de código para que funcione en Xamarin.iOS.

Recuerda que el código de las apps tanto de C# y Swift están disponibles en GitHub par que las revises, si tienes alguna duda, no dudes en contactarme, al final del post están los enlaces necesarios.