En este artículo veremos cómo implementa Swift las clases de las que os hablé en el artículo El concepto de clase en POO y además veremos un nuevo concepto que incorpora este lenguaje, parecido a la clase, denominado estructura.
Las clases y estructuras van a ser construcciones flexibles que se convertirán en los componentes básicos de cualquier programa escrito en Swift. Podremos definir propiedades (atributos) y métodos para añadir funcionalidad a las mismas usando exactamente la sintaxis que empleábamos en constantes, variables y funciones. Si queréis saber más os recomiendo que leáis el artículo Como usar constantes y variables en Swift de forma básica.
A diferencia de lo que ocurre en otros lenguajes de programación como C++, en Swift no se requiere crear dos ficheros distintos uno para la interfaz (donde se definen los métodos y propiedades) y otro para la implementación de dichos métodos. Podremos definir una clase o estructura en un único fichero y será el propio entorno el que hará que la interfaz externa esté disponible para usarla en otro código distinto.
Una instancia de una clase es conocida como un objeto (puedes leer más sobre objetos en el artículo ¿Qué son los objetos en la POO y cómo se representan?) Sin embargo, las clases y estructuras en Swift tienen mucha más funcionalidad que en otros lenguajes. Por esto, el uso del término instancia es mucho más genérico.
Comparando Clases y Estructuras
Las clases y estructuras en el lenguaje de programación Swift tienen numerosas cosas en común ya que ambas:
- Pueden definir propiedades para almacenar valores
- Pueden definir métodos que van a implementar su funcionalidad
- Pueden definir subscripts que van a proporcionar acceso a sus valores usando la sintaxis de subscript
- Pueden definir métodos inicializadores para establecer su estado inicial
- Pueden ser extendidas para expandir su funcionalidad lejos de la implementación por defecto
- Pueden usar protocolos estándar para proporcionar una determinada funcionalidad
Por el contrario, las clases en Swift tienen capacidades adicionales que las estructuras no poseen:
- La herencia permite a una clase heredar características de otra. En otros artículos trataremos el tema de la herencia.
- El casting de tipos permite comprobar el tipo de una instancia de clase (objeto) en tiempo de ejecución
- Los métodos destructores (os también Des-Inicializadores) permiten destruir de la memoria un objeto para liberar los recursos que esta tuviera asignados
- Reference counting permite más de una referencia a un objeto. También trataremos este tema con más detalle
¿Cómo definir una clase o estructura en Swift?
Las clases y estructuras tienen una sintaxis similar cuando las definimos. Si observamos los siguientes ejemplos usamos las palabras reservadas class y struct, seguidas de un nombre identificativo para después incluir el código fuente de la definición encerrado entre llaves.
class UnaClase {
// Aquí iría la definición de la clase
struct UnaEstructura {
// Aquí iría la definición de la estructura
}
Lo bueno del caso es que se pueden mezclar clases y estructuras para dar una mayor consistencia y flexibilidad a nuestro programa orientado a objetos. El siguiente ejemplo, muestra la forma de combinarlas modelando una clase que representa la resolución de video de un monitor cualquiera:
struct Resolucion {
var ancho = 0
var alto = 0
}class ModoDeVideo {
var resolucion = Resolucion()
var entrelazado = false
var frecuencia = 0.0
var nombre: String?
}
En el ejemplo de clases y estructuras que acabamos de ver, se define una nueva estructura llamada Resolucion para modelar una resolución de pantalla en pixeles. Esta estructura nos permite almacenar dos propiedades llamadas ancho y alto. Estas están empaquetadas y almacenadas como parte de la estructura en si. Como se puede ver, hemos inicializado ambas con el valor 0.
Como también podemos ver, hemos definido una clase llamada ModoDeVideo para modelar las características del video a mostrar en una pantalla o monitor. Esta clase almacena cuatro variables. La primera de ellas es la resolución, que va a ser inicializada con una instancia de la estructura Resolucion que va a inferir las propiedades ancho y alto. Las demás propiedades indicarán si el video es o no entrelazado, la frecuencia de refresco en frames por segundo y un String opcional que indica el nombre del modo de vídeo. Esta propiedad nombre es establecida automáticamente a nil o «sin valor» porque es de tipo optional. (Podéis leer más sobre valores de este tipo en Usando los tipos de datos opcionales en Swift).
Hasta aquí el artículo en el que hemos aprendido a definir clases y estructuras en Swift. En próximos artículos veremos como crear instancias de clases y estructuras y usar las propiedades a la hora de escribir nuestro propio programa. Espero que te haya resultado interesante y que si tienes alguna duda te pongas en contacto conmigo en este formulario. Nos leemos en el próximo.
Adios, os!