Herencia en Swift: class vs struct

Resumen

Trabajar con class en Swift te permite modelar entidades complejas y reutilizar comportamiento mediante herencia, algo que no consigues con un struct. Aquí aprenderás a declarar una clase Student, crear una subclase AdvancedStudent y sobrescribir funciones para personalizar su comportamiento.

Cómo declaro una clase en Swift

Una clase se define con la palabra reservada class y agrupa propiedades y funciones que describen una entidad. En el ejemplo se crea un archivo Student.swift dentro de la carpeta Sources y se declara la clase como public para poder usarla desde el playground.

La clase Student contiene cinco propiedades que describen al estudiante:

  • name de tipo String, para el nombre.
  • age de tipo Int, porque la edad no admite decimales.
  • email de tipo String, como dato de contacto.
  • subjects, una lista del tipo Subject creado en una clase anterior.
  • scores, una lista de tipo Double con las notas asociadas.

¿Qué diferencia hay entre class y struct en Swift? Las clases permiten herencia y se pasan por referencia; los structs no heredan y se pasan por valor. Si necesitas reutilizar comportamiento entre tipos relacionados, usa class.

Cómo defino el inicializador public init

Después de las propiedades viene el public init, que recibe los mismos parámetros que las propiedades y los asigna con self. Xcode suele autocompletar esta firma, lo que ahorra tiempo cuando la clase tiene varios atributos [02:00].

Para mostrar los datos en consola se crea una función studentDescription que retorna un String. Dentro se declara una variable desc con la información básica, se recorren las materias con un ciclo for concatenando la descripción de cada Subject, y al final se agrega un salto de línea antes del return [03:30].

Cómo funciona la herencia en Swift

La herencia es un concepto de programación orientada a objetos que permite que una clase hija reutilice las propiedades y funciones de una clase padre. En Swift se indica con dos puntos después del nombre de la subclase.

Imagina que además de estudiantes normales necesitas modelar estudiantes avanzados, que tienen todo lo de un estudiante más unos puntos extra por proyectos previos. En lugar de duplicar código, creas una subclase que herede de Student.

Cómo creo la subclase AdvancedStudent

En un nuevo archivo AdvancedStudent.swift se declara la clase así: public class AdvancedStudent: Student. Esa sintaxis con dos puntos significa que AdvancedStudent hereda de Student y obtiene de inmediato sus propiedades y funciones [05:30].

La única propiedad nueva es extraPoints de tipo Double. El inicializador de la subclase sigue tres pasos clave:

  1. Recibe los mismos parámetros que el estudiante normal más extraPoints.
  2. Asigna primero las propiedades propias con self.extraPoints = extraPoints.
  3. Llama a super.init(...) para que la clase padre inicialice el resto.

¿Qué hace super.init en Swift? Invoca el inicializador de la clase padre desde una subclase, asegurando que las propiedades heredadas queden correctamente asignadas antes de continuar.

Cómo sobrescribo una función con override

La palabra override indica que estás reemplazando una función heredada. Si intentas redefinir studentDescription sin ella, Xcode marca un error y te sugiere agregarla.

En el ejemplo, la subclase reescribe studentDescription para anteponer el título Estudiante avanzado y añadir los puntos extra al texto que ya retornaba la clase padre. Así, al imprimir en consola, el estudiante normal Tiago muestra su información estándar, mientras que la estudiante María aparece marcada como avanzada con sus 10 puntos extra visibles [12:00].

Cómo pruebo class y herencia en el playground

En el archivo SystemManager se crean dos instancias para validar el comportamiento:

  • s1 es un Student llamado Tiago, de 18 años, con la materia de Matemáticas y una nota de 70.
  • s2 es un AdvancedStudent llamado María, de 19 años, con nota de 80 y 10 puntos extra.

Al imprimir s1.studentDescription() y s2.studentDescription(), la consola muestra ambas versiones del texto: la genérica para el estudiante normal y la personalizada para el avanzado. Esa diferencia visible en consola confirma que la herencia y el override funcionan como esperabas.

Si Xcode lanza errores temporales por caché, basta con correr el playground otra vez para que se limpien y compile sin problema.

¿En qué otro escenario de la vida real usarías clases y herencia en Swift? Déjamelo en los comentarios.