La semana pasada revisábamos algunos detalles fundamentales sobre la naturaleza del lenguaje Swift de Apple, viendo por ejemplo cómo se definían variables, constantes, enumeraciones, clases y cómo se manejaban las referencias.
Ahora vamos a continuar estudiando algunos detalles más que te ayudarán a saber algo más sobre su naturaleza, sobre todo si lo comparas con un lenguaje que ya conozcas.
Protocolos
Un protocolo es el equivalente en Swift a las interfaces de C# y Java. Es decir, un protocolo define un conjunto de métodos que luego una clase debe implementar. Cuando una clase implementa los métodos de un protocolo se dice que "conforma dicho protocolo".
Un aspecto a tener presente de los protocolos es que éstos pueden definir métodos opcionales, es decir, métodos que pueden, aunque no tienen por qué, ser implementados por las clases que conformen dichos protocolos.
Se pueden declarar referencias a protocolos y usar parámetros y valores de retorno de tipo protocolo.
Genéricos
Los genéricos son una de las novedades más destacadas de Swift respecto a Objective-C.
Si conoces este concepto de C# o Java, o bien estás familiarizado con las templates de C++ no te costará mucho entenderlo(aunque los genéricos de Swift tienen mucho más parecidos con los de C# o Java que con las templates).
Se llama genéricos a la posibilidad de pasar como un parámetro un tipo en lugar de un valor. Los genéricos permiten una mayor reutilización de código al poder reaprovechar un mismo código (una clase o un método) para que trabaje con varios tipos de datos distintos.
Inferencia de tipos
Swift es un lenguaje con tipado estático, es decir, las variables tienen un tipo establecido en tiempo de compilación. Pero si al declarar una variable le asignamos un valor inicial, el compilador puede inferir el tipo de la variable y no es necesario que lo indiquemos nosotros.
Así en Swift se puede hacer:
var message = "Hello world!"
Y el compilador asignará el tipo String a la variable message. Simplemente porque la expresión asignada ("Hello world!") es de tipo String.
Si queremos, podemos establecer el tipo de la variable pero es algo opcional:
var message : String = "Hello world!"
Ahora bien, la inferencia de tipos requiere que la variable se asigne a una expresión al declararse y no solo eso, requiere también que el compilador pueda determinar el tipo de la expresión asignada.
Es por ello que el siguiente código no compila:
var message // Error: no se asigna expresión alguna a message por lo que el compilador no puede deducir el tipo
var message = nil // Error: nil no tiene ningún tipo en concreto
En estos casos debemos especificar el tipo de la variable:
var message : String
var message : MyClass
Nota: Recuerda que la inferencia de tipos no convierte al lenguaje en dinámico, ni mucho menos. Una vez una variable tiene un tipo (explicitado por el desarrollador o inferido) lo mantiene para siempre y solo puede contener valores de este tipo.