El nuevo lenguaje de Apple: Swift

La novedad de la que más se ha hablado en el último WWDC ha sido, con diferencia, un nuevo lenguaje de programación creado por Apple: Swift.

Desde que Apple compró a NeXT hasta la fecha, toda la programación para las plataformas Apple se viene haciendo fundamentalmente en Objective-C, un lenguaje que combina características de C y Smalltalk.

Se trata del 3er lenguaje más usado en el mundo (básicamente debido a iOS) y con usuarios relevantes (aunque poco conocidos) fuera del ecosistema Apple. Por ejemplo, un gran porcentaje de los sms premium que se envían en el Reino Unido, son gestionados por una aplicación creada con Objective-C en su encarnación Open Source: gnuStep.

En estos momentos, existe, tanto dentro como fuera de Apple una legión de desarrolladores y código que lo usa. Por lo tanto, la primera pregunta que uno debería de hacerse es ¿por qué Apple introduce un nuevo lenguaje?

No obstante, antes de intentar responder esa pregunta, veamos otra, que es aun más interesante para los frikis: ¿qué tipo de lenguaje es Swift? ¿De verdad es algo nuevo?

¿Qué tipo de lenguaje es Swift de Apple?

Dicen de Santillana del Mar, que es la ciudad de las 3 mentiras: ni es santa, ni es llana, ni está a orillas del mar. Algo parecido se podría decir de Swift. Cuando lo lanzaron, lo describieron como un lenguaje más rápido, más sencillo y "Objective-C sin C". A poco que se escarba en él, esa descripción empieza a parecer cada vez menos acertada.

No hay motivos para que Swift sea más rápido que Objective-C (y vice versa): ambos usan el mismo compilador y la misma librería de clases. Por supuesto que si uno quiere, puede encontrar casos específicos en los cuales uno de los dos patina de forma espantosa y mostrar eso como "prueba". Sin embargo, en aplicaciones reales, no creo que haya grandes diferencias en favor de cualquiera de los dos.

Una de las razones por las cuales se está generando un enorme interés por Swift, es por su aparente sencillez. Lamentablemente, después de muchas horas con el lenguaje, he de decir que no soy de esa opinión. Objective-C tiene una sintaxis extraña pero sumamente sencilla y homogénea. Swift, por otro lado, tiene una sintaxis más familiar, pero esconde una infinidad de casos especiales, detalles sutiles y variaciones sintácticas para hacer una misma cosa. Bajo una capa de aparente sencillez, se esconde un lenguaje con una complejidad solo comparable a C++.

"Objective-C sin C". Esa frase dio a entender a muchos que se trataba de un nuevo lenguaje que preservaba las características esenciales del lenguaje, eliminando las "rémoras del pasado". Nada más lejos de la realidad. Swift es un lenguaje, no sólo distinto, sino opuesto en casi todo a Objective-C.

Se trata de un lenguaje fuertemente tipado, que no solo no busca la sencillez y la homogeneidad, sino que se regodea en todos los casos especiales posibles y cuando no los encuentra, los crea.

Sospecho que Swift será enormemente popular entre nuevos desarrolladores que se acercan a iOS y OSX provenientes de Java o C++, así como entre aquellos desarrolladores a los que Objective-C les disgusta.

Un vistazo al lenguaje Swift: variables y constantes

Talk is cheap. Show me the code. -- Linus Torvalds

Basta de rollos, y echemos un vistazo al lenguaje en sí.

En Swift las variables y constantes tienen dos propiedades:

  • un valor

  • un tipo

Las variables pueden cambiar su valor, pero jamás su tipo. Las constantes no pueden cambiar nada... ¡excepto en el caso de los Arrays, donde sí se pueden cambiar los elementos pero no el tamaño!

Este es el tipo de excepciones y casos especiales que facilitan la vida del creador del compilador pero complican y sobrecargan el día a día del usuario del lenguaje.

// Una variable de tipo String
var s:String = "Hola Swift"

// Como le hemos pasado un valor inicial cuyo tipo es 
// evidente (una cadena), podemos eliminar la declaración
// del tipo de la variable:
var ss = "Hola de nuevo"
ss = 42     // ¡Error! El tipo no puede cambiar a Int

Echemos un vistazo ahora a las constantes, que se introducen con la palabra clave let:

// Una constante
let a:Int = 42
//a = 21      // ¡Error! No podemos cambiar nada

let primos = [2,5,7]
primos[0] = 45      // ¡¿Eh?! ¿No habíamos quedado en que era cte?

Funciones en Swift

Uno de los puntos fuertes de Swift es el manejo de funciones, que con la salvedad del tipado fuerte y explícito, recuerda algo a Javascript.

Podemos declarar funciones que aceptan otras funciones como parámetros, funciones que devuelven funciones y funciones genéricas (al igual que en C++). Veamos algunos ejemplos:

// Una función muy sencilla: recorre un array
// sumando todos los elementos
// :Int[] indica que recibe un array de enteros
// -> Int indica que devuelve un entero
func sum(ints:Int[])->Int{
    
    var total = 0 // como tiene valor inicial, ya sabe que es un Int
    for each in ints{
        total += each
    }
    return total
}


// Una vuelta de tuerca: antes de sumar, le aplica
// a cada elemento una función (que acepta un entero
// y devuelve otro) a cada uno de los elementos
func sumPlus(ints:Int[], h:Int->Int)->Int{
    // h es la función que recibe por parámetros
    
    var total = 0
    for each in ints{
        total += h(each)
    }
    return total
}

A cualquiera que haya hecho algo de programación funcional, esto le debería de sonar. En este sentido Swift está a la par con todos los nuevos lenguajes que andan saliendo, con un claro componente funcional, como Scala, F#, etc...

No obstante, también vemos que la sintaxis no es moco de pavo y es fácil perder la esencia de lo que haces entre tanta sintaxis.

¿"Objective-C sin C" u "Objective-C sin Objective y con un ++"?

A medida que uno explora el lenguaje Swift, vamos viendo que no tiene nada que ver con Objetive-C, pero sí un enorme parecido con C++11: genéricos, plantillas, tipado estricto, flirteo con el mundillo funcional y ante todo una complejidad apabullante, que debe de ser manejada a diario por el desarrollador.

Creo que Swift tendrá un gran éxito entre los desarrolladores Java y C++ que se aproximen al desarrollo iOS, pero no va a convencer a fieles de Objective-C.

¿Por qué un nuevo lenguaje?

Nos ha quedado la pregunta del millón: ¿por qué un nuevo lenguaje y por qué uno tan distinto al actual?

Hay quien cree, como Aral Balkan en el webinar de "Swift en Español", que el objetivo tanto de Google como Apple es de cerrar cada vez más sus respectivas plataformas.

Personalmente, creo que la respuesta es más sencilla y menos siniestra: Apple necesita un lenguaje más sencillo que facilite la incorporación de nuevos desarrolladores. Objective-C no es, ni remotamente, un lenguaje complejo, pero sí tiene una sintaxis "extraña" que muchos perciben como una barrera de entrada. Con Swift, un lenguaje de aspecto más "estándar", se prevee un aluvión de nuevos desarrolladores que hasta entonces habían evitado la plataforma u optado por "rodeos" como Corona, Appcelerator o Lanica.

¿Quieres saber más de Swift?

Además del libro gratuito de Apple en iBooks, puedes ver el primer webinar sobre Swift en Español:

En Genbeta Dev | Swift, Apple lanza un nuevo lenguaje para programar en iOS y OS X

Ver todos los comentarios en https://www.genbeta.com

VER 0 Comentario

Portada de Genbeta