Inicializadores en Sweet: Creación y Uso Efectivo de Constructores

Clase 18 de 27Curso de Programación Orientada a Objetos en Swift

Resumen

Una base sólida en Swift empieza entendiendo cómo se crean objetos de forma segura. Aquí verás, con ejemplos claros, cómo un inicializador asigna valores a las propiedades desde el primer instante, por qué init es un método especial y cómo convertir entre Fahrenheit, Celsius y Kelvin sin sorpresas. Ideal para practicar en un Playground.

¿Qué es un inicializador en Swift y para qué sirve?

Un inicializador es el punto de arranque de cualquier clase o estructura. En Swift se invoca con init y su misión es dar valores iniciales a las propiedades. Si una propiedad no tiene valor por defecto, el inicializador garantiza que el objeto nace en un estado válido.

  • En otros lenguajes se habla de “constructor”. En Swift, se usa el término inicializador porque la palabra clave es init.
  • Durante la creación del objeto, init puede acceder a las variables y modificarlas para establecer el estado inicial.

¿Por qué se llama inicializador y no constructor?

Porque en Swift se invoca con init y, por convención, se le llama inicializador. La idea es la misma: preparar el objeto con valores consistentes.

¿Qué hace durante la creación del objeto?

  • Asigna valores a cada propiedad necesaria.
  • Usa self para dejar claro que se modifica la propiedad de la instancia.
  • Puede tener varias variantes según los datos de entrada.

¿Cómo se implementa init con ejemplos en Fahrenheit y Celsius?

Verlo en código ayuda a fijar los conceptos. Primero, una estructura con una propiedad sin valor por defecto y un init que lo resuelve. Después, una estructura con múltiples inicializadores que convierten desde diferentes escalas.

¿Cómo dar un valor por defecto con init en Fahrenheit?

Problema: si creas una instancia sin valor inicial, la propiedad queda indeterminada. Solución: establecer un valor estándar dentro de init usando self.

struct Fahrenheit { var temperature: Double init() { self.temperature = 32 } } var f1 = Fahrenheit() // f1.temperature == 32
  • Alternativa equivalente: asignar el valor por defecto directamente en la propiedad.
struct Fahrenheit { var temperature: Double = 32 }
  • Punto clave: self asegura que modificas la propiedad de la instancia, no una variable local.

¿Cómo crear varios inicializadores en Celsius desde Fahrenheit y Kelvin?

Cuando una misma estructura puede nacer de datos distintos, conviene definir varios inicializadores. Aquí, dos formulas de conversión precisas:

  • De Fahrenheit a Celsius: (F − 32) / 1.8.
  • De Kelvin a Celsius: K − 273.15.
struct Celsius { var temperature: Double init(fromFahrenheit fahrenheit: Double) { self.temperature = (fahrenheit - 32) / 1.8 } init(fromKelvin kelvin: Double) { self.temperature = kelvin - 273.15 } } let boilingPointOfWater = Celsius(fromFahrenheit: 212) // 100.0 °C let freezingPointOfWater = Celsius(fromKelvin: 273.15) // 0.0 °C
  • Los 32 °F equivalen a 0 °C con la fórmula anterior.
  • 273.15 K equivalen a 0 °C con la segunda fórmula.
  • Definir varios init permite inicializar según el origen del dato, manteniendo la propiedad en un estado coherente.

¿Qué considerar sobre múltiples inicializadores y herencia?

A medida que los modelos crecen, surgen preguntas relevantes sobre el diseño con inicializadores y clases:

  • Un inicializador es responsable de dejar todas las propiedades con valores válidos.
  • Es habitual tener varios init cuando hay distintos orígenes de datos.
  • En herencia: ¿una clase hija hereda los inicializadores? ¿Se pueden sobreescribir o modificar? Estas preguntas se abren para profundizar más adelante.

¿Tienes dudas sobre qué variante de init usar o cómo estructurar las conversiones? Comparte tu caso y lo revisamos juntos.

      Inicializadores en Sweet: Creación y Uso Efectivo de Constructores