Modificación de Constructores y Parámetros Opcionales en Swift

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

Resumen

Domina los inicializadores en Swift con buenas prácticas de nombres, etiquetas de parámetros y manejo de opcionales. Verás cómo crear varios inicializadores en una misma estructura, cuándo omitir etiquetas con subrayado para una sintaxis más legible y qué propiedades debes inicializar siempre en una clase. Todo con ejemplos simples y directos.

¿Cómo crear y sobrecargar inicializadores en Swift?

Definir varios inicializadores permite construir un mismo tipo de diferentes formas. En una estructura de color, las componentes rojo, verde y azul se representan como valores de tipo Double. Si los parámetros de init se llaman igual que las propiedades, usa self. para asignar correctamente.

struct Color {
    var red: Double
    var green: Double
    var blue: Double

    init(red: Double, green: Double, blue: Double) {
        self.red = red
        self.green = green
        self.blue = blue
    }

    // Escala de grises: las tres componentes comparten el mismo valor.
    init(white: Double) {
        self.red = white
        self.green = white
        self.blue = white
    }
}

// Ejemplos de uso
let magenta = Color(red: 1, green: 0, blue: 3)
let halfGray = Color(white: 0.5)
  • Puedes definir múltiples inicializadores con diferentes firmas.
  • Cuando coinciden nombres, usa self.propiedad = parámetro.
  • Escala de grises: un único parámetro se propaga a las tres componentes.
  • Llamadas explícitas: usa etiquetas de argumento como red:, green:, blue:.

¿Por qué las etiquetas de parámetros son obligatorias en struct?

En Swift, las estructuras generan inicializadores con etiquetas externas por defecto. Al invocar, debes incluirlas; omitirlas provoca error. Es una ayuda de legibilidad y claridad.

// Error: faltan etiquetas externas
auto let c = Color(1, 0, 1) // ❌

// Correcto: con etiquetas
let c = Color(red: 1, green: 0, blue: 1) // ✅

¿Cuándo omitir una etiqueta con subrayado en init?

Hay parámetros cuyo nombre se sobreentiende por el contexto. En un tipo Celsius, escribir la etiqueta externa "celsius" al invocar puede resultar redundante. Para lograr una lectura natural, usa el subrayado en la etiqueta externa del init.

struct Celsius {
    var temperature: Double

    // Omitir etiqueta externa con "_"
    init(_ celsius: Double) {
        self.temperature = celsius
    }
}

let bodyTemperature = Celsius(37)
  • Lectura fluida: cuando el contexto es claro, omite la etiqueta externa.
  • Sintaxis: declara el init con "_" como etiqueta externa.
  • Invocación: pasa solo el valor, sin nombre de parámetro.

¿Cómo manejar propiedades opcionales y requeridas en una clase?

Las propiedades no opcionales deben quedar inicializadas al final del init. Las opcionales pueden empezar sin valor. En una pregunta de encuesta, el texto es obligatorio, la respuesta puede ser String?. Además, si el texto no cambia, declara la propiedad como constante con let.

class SurveyQuestion {
    let text: String
    var response: String?

    init(text: String) {
        self.text = text
    }

    func ask() {
        print(text)
    }
}

let q1 = SurveyQuestion(text: "¿Te gustan los tacos?")
q1.ask()                      // Muestra la pregunta.
q1.response = "Sí, me encantan todos ellos" // Se asigna después.
  • Propiedades requeridas: deben inicializarse siempre en el init.
  • Propiedades opcionales: pueden permanecer sin valor hasta más tarde.
  • Inmutabilidad útil: usa let cuando el valor no cambia.
  • Flujo natural: primero se formula la pregunta, luego llega la respuesta.

¿Tú cómo eliges las etiquetas de parámetros en tus inits? Comparte en comentarios tus ejemplos de inicializadores, usos de subrayado y manejo de opcionales en Swift.

      Modificación de Constructores y Parámetros Opcionales en Swift