Tu primera vista y el paradigma declarativo
SwiftUI describe la interfaz, no la construye paso a paso. Entiende el protocolo View, la propiedad body y el preview en vivo que lo hace mágico.
SwiftUI cambia por completo cómo se construyen interfaces. En vez de crear botones y decirles qué hacer paso a paso, tú describes cómo debe verse la pantalla para un estado dado, y el framework se encarga del resto. Es el mismo salto mental que diste con map y filter, ahora aplicado a la UI.
- Entender “declarativo” frente a “imperativo”.
- El protocolo
Viewy la propiedadbody. - Componer vistas básicas: Text, Image, Button.
- Usar el preview en vivo de Xcode.
Declarativo vs imperativo
En el modelo antiguo (imperativo) creabas una etiqueta, luego le ponías texto, luego color, luego la añadías a la pantalla — instrucción a instrucción. En SwiftUI (declarativo) simplemente describes el resultado:
import SwiftUI
struct Saludo: View {
var body: some View {
Text("¡Hola, mundo!")
.font(.largeTitle)
.foregroundStyle(.blue)
}
}
No dices “crea un texto y luego cámbiale la fuente”: declaras “esto es un texto grande y azul”. Cuando el estado cambie, SwiftUI recalcula la descripción y actualiza la pantalla por ti.
El protocolo View y body
Toda vista de SwiftUI es un struct que conforma al protocolo View, y su único requisito es la propiedad body:
struct MiVista: View {
var body: some View {
Text("Contenido")
}
}
¿Recuerdas los tipos opacos del Nivel 1? body: some View significa “algún tipo concreto de vista”. No te preocupa cuál: SwiftUI lo resuelve. Y como las vistas son structs (tipos de valor), son ligeras de crear y destruir: SwiftUI las recrea constantemente sin coste, otra pieza del Nivel 1 encajando.
Vistas básicas
Text("Título").font(.title).bold()
Image(systemName: "star.fill") // iconos SF Symbols, gratis y enormes
.foregroundStyle(.yellow)
Button("Guardar") {
print("guardado") // trailing closure: la acción
}
Image(systemName:) usa SF Symbols, la biblioteca de miles de iconos de Apple. Y ese { print("guardado") } del botón es un trailing closure — el código del Nivel 0 que se ejecuta al pulsar.
Componer: las vistas se anidan
Construyes interfaces metiendo vistas dentro de otras. Un contenedor VStack apila en vertical (lo verás a fondo en la próxima lección):
struct Tarjeta: View {
var body: some View {
VStack {
Image(systemName: "swift").font(.largeTitle)
Text("Swift").font(.title)
Text("Aprendiendo SwiftUI").foregroundStyle(.secondary)
}
}
}
El preview en vivo
Lo que hace a SwiftUI adictivo: ves los cambios al instante, sin compilar y ejecutar la app entera. Añade un preview:
#Preview {
Tarjeta()
}
Xcode muestra tu vista renderizada al lado del código y la actualiza mientras escribes.
Con #Preview, el ciclo escribir → ver → ajustar tarda segundos, no un build completo. Puedes tener varios previews (distintos estados, modo claro/oscuro, varios tamaños) visibles a la vez. Aprovéchalo: itera en el preview y solo ejecuta en el simulador cuando necesites probar interacción real. Es la diferencia entre diseñar con fluidez y esperar compilaciones.
- Crea una
structque conforme aViewcon una propiedadbody. - Muestra un
Textcon.font()y.foregroundStyle(). - Añade un
Image(systemName:)con un SF Symbol que te guste. - Mételo todo en un
VStackjunto con unButton. - Añade un
#Previewy observa el render en vivo.