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

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

Contenido del curso

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