Programación de Dispositivos Móviles · Tema 6

Módulo iPhone

Desarrollo iOS con Swift y SwiftUI — del ecosistema Apple al proceso completo de publicación en App Store.

🍎 Familia iOS 🛠️ Xcode y Swift 📱 UIKit vs SwiftUI 🚀 App Store 🏋️ Actividades 📖 Glosario
01
La Familia iOS y el Ecosistema Apple
Historia · Dispositivos · iOS vs Android

🍎 ¿Qué es el ecosistema Apple?

Apple no vende solo teléfonos — vende un ecosistema: todos sus dispositivos comparten la misma arquitectura (ARM), el mismo lenguaje de programación (Swift), el mismo IDE (Xcode) y el mismo framework de interfaz (SwiftUI). Aprender a desarrollar para iPhone abre la puerta a todas las plataformas Apple a la vez.

💡 Idea clave

Con Swift + SwiftUI, el mismo código puede ejecutarse en iPhone, iPad, Mac, Apple Watch y Apple TV con ajustes mínimos. Apple Silicon ha unificado la arquitectura ARM en todos sus dispositivos.

📱
iPhone
iOS 18
Mercado principal. Swift + SwiftUI + UIKit
📲
iPad
iPadOS 18
Stage Manager, Apple Pencil, Split View
💻
Mac
macOS 15
Apple Silicon ARM — apps iOS en Mac
Apple Watch
watchOS 11
SwiftUI nativo, HealthKit, biométricos
📺
Apple TV
tvOS 18
SwiftUI + TVUIKit
🥽
Vision Pro
visionOS 2
RealityKit, ARKit, realidad espacial

📅 Evolución histórica de iOS

2007
iPhone OS 1Primer iPhone — pantalla capacitiva, sin App Store
2008
iPhone OS 2App Store con 500 apps el día del lanzamiento
2010
iOS 4Multitarea, FaceTime, Game Center
2013
iOS 7Rediseño total con diseño plano (Jony Ive)
2017
iOS 11ARKit, Face ID en iPhone X, Edge-to-Edge
2019
iOS 13Dark Mode, Sign in with Apple, SwiftUI 1.0
2023
iOS 17StandBy, Journal, NameDrop, Interactive Widgets
2024
iOS 18Apple Intelligence — IA integrada, personalización

⚔️ iOS vs Android: diferencias clave

DimensióniOS (Apple)Android (Google)
Lenguaje nativoSwift / SwiftUIKotlin / Jetpack Compose
IDE oficialXcode — solo macOSAndroid Studio — multiplataforma
FragmentaciónMuy baja (~5 modelos principales)Muy alta (+1.000 modelos distintos)
Cuota global~29% (55%+ en EE.UU. y Japón)~70% (LATAM, África, Asia)
Gasto por usuario2–3× mayor que AndroidBase de referencia
Revisión de appsManual por Apple, 1–7 díasMayoritariamente automática, horas
Actualización del OS~95% actualizan en 2 años~50% actualizan en 2 años
Developer Program$99 USD/año obligatorio$25 USD pago único
~29%
Cuota de mercado global iOS
2–3×
Más ingresos por usuario vs Android
95%
Dispositivos en iOS de los últimos 2 años
iOS 16
Minimum deployment target recomendado
🙋 Pregunta para el alumno

Si quisieras lanzar una app de pago de 4,99€ dirigida a profesionales creativos en EE.UU. y Europa, ¿empezarías por iOS o Android? ¿Qué datos justifican tu elección?

📋 Mini resumen

El ecosistema Apple unifica iPhone, iPad, Mac, Watch y TV bajo Swift + SwiftUI. iOS tiene el 29% global pero lidera en ingresos por usuario. ~95% actualiza rápidamente, fragmentación mínima. Deployment target iOS 16-17 cubre el 95% del mercado activo.

02
Entorno de Trabajo: Xcode y Swift
IDE · Paneles · Swift moderno · Async/Await

🛠️ Xcode: el IDE de Apple

Xcode es el entorno de desarrollo oficial de Apple — completamente gratuito en la Mac App Store. Es la herramienta única para desarrollar para todo el ecosistema Apple (iPhone, iPad, Mac, Watch, TV, Vision Pro).

Requisito importante: Xcode solo funciona en macOS. No hay versión para Windows o Linux.

ComponenteMínimoRecomendado
Sistema operativomacOS 14 SonomamacOS 15 Sequoia
ProcesadorMac Intel o Apple SiliconApple Silicon M1 o superior
RAM8 GB16 GB o más
Espacio en disco10 GB (Xcode + SDKs)50 GB+ (simuladores adicionales)
Cuenta AppleApple ID gratuita (simulador)$99/año para subir a App Store

Los 5 paneles de Xcode:

MiApp — iPhone 16 Pro (Simulador) ▶ Cmd+R
◀ Navigator
📁 MiApp
📄 MiAppApp.swift
📄 ContentView.swift
📁 Features/
📁 Resources/
🔧 Info.plist
Editor Central
struct ContentView: View {
@State var texto = ""
var body: some View {
Text("Hola")
}
}
Inspector ▶
Font: .title
Color: .blue
Padding: 16
Alignment: .center
▶ Build Succeeded (2.4s) | No issues | 0 warnings | iPhone 16 Pro
PanelFunción
Navigator (izquierda)Árbol de proyecto, búsqueda, issues, Git, tests y breakpoints
Editor (centro)Código Swift, SwiftUI Canvas preview en tiempo real
Inspector (derecha)Atributos de views, conexiones IBOutlet/IBAction
Debug Area (inferior)Consola de output, LLDB debugger, Memory Graph
Toolbar (superior)Botón Run/Stop, selector de simulador, métricas de build

Atajos esenciales:

// Atajos de teclado imprescindibles en Xcode
Cmd + R          → Compilar y ejecutar la app
Cmd + B          → Solo compilar (sin ejecutar)
Cmd + .          → Detener la ejecución
Cmd + Shift + K  → Limpiar la build (Clean Build Folder)
Cmd + /          → Comentar / descomentar línea
Ctrl + I         → Re-indentar código seleccionado
Cmd + 0          → Mostrar/ocultar Navigator
Cmd + Option + 0 → Mostrar/ocultar Inspector
Cmd + U          → Ejecutar todos los tests
Cmd + Shift + O  → Open Quickly (buscar archivo)

🦅 Swift: seguro, rápido y moderno

Swift es el lenguaje creado por Apple en 2014 (open source desde 2015). Sustituye a Objective-C como lenguaje principal del ecosistema Apple. Compila a código máquina nativo ARM — rendimiento comparable a C++.

🛡️
Seguro
Optionals para valores nulos, tipos estrictos, ARC para gestión de memoria automática.
Rápido
Compilado a ARM nativo. Rendimiento comparable a C++.
Moderno
async/await, @Observable, property wrappers, result builders, macros.
🔗
Interoperable
Puede llamar a código Objective-C existente sin wrappers adicionales.

Variables, constantes y Optionals:

// Constante (inmutable) — usar siempre que sea posible
let nombre: String = "Ana García"
let edad = 28               // Swift infiere el tipo: Int

// Variable (mutable)
var puntuacion: Int = 0
var activo: Bool = true

// Optional — puede ser un valor o nil
var email: String? = nil
email = "ana@ejemplo.com"

// Optional binding — unwrap seguro
if let e = email {
    print("Email: \(e)")
}

// Guard let — early exit, código más limpio
func procesar(email: String?) {
    guard let e = email else { return }
    enviarCorreo(a: e)
}

// Nil coalescing — valor por defecto si nil
let texto = email ?? "sin email"

Structs, Enums y Protocolos:

// Struct (tipo valor — se copia al asignar)
struct Producto {
    let id: UUID = UUID()
    var nombre: String
    var precio: Double
    
    // Computed property — se calcula, no se almacena
    var descripcion: String { "\(nombre) — \(precio)€" }
    
    mutating func aplicarDescuento(_ porcentaje: Double) {
        precio *= (1 - porcentaje)
    }
}

// Enum con valores asociados — muy potente
enum EstadoPedido {
    case pendiente
    case procesando(progreso: Double)
    case enviado(tracking: String)
    case entregado(fecha: Date)
    case cancelado(motivo: String)
}

// Protocolo — define un contrato
protocol Persistible {
    var id: UUID { get }
    func guardar() throws
}

Concurrencia moderna: async/await (Swift 5.5+, iOS 15+):

// async/await — llamada de red sin callbacks
func obtenerUsuario(id: String) async throws -> Usuario {
    let url = URL(string: "https://api.ejemplo.com/users/\(id)")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONDecoder().decode(Usuario.self, from: data)
}

// Uso en SwiftUI con .task
.task {
    do {
        usuario = try await obtenerUsuario(id: "123")
    } catch {
        errorMessage = error.localizedDescription
    }
}

// async let — paralelismo: ambas peticiones a la vez
async let perfil = obtenerPerfil(userId)
async let pedidos = obtenerPedidos(userId)
let (p, o) = try await (perfil, pedidos)

// Actor — protege datos con acceso concurrente seguro
actor ContadorSeguro {
    private var valor = 0
    func incrementar() { valor += 1 }
}
⚠️ Error frecuente

Usar var cuando debería ser let. En Swift, la regla de oro es siempre let por defecto. Solo usar var cuando el valor vaya a cambiar. El compilador avisa si declaras un var que nunca se modifica.

💡 Optional: la seguridad contra nil

En Swift, nil no puede aparecer en una variable normal — causaría un error de compilación. Los Optionals (el signo ?) son la declaración explícita de que un valor puede o no estar presente. Esto elimina la clase entera de bugs «null pointer exception» tan comunes en Java/Kotlin.

🙋 Pregunta para el alumno

¿Cuál es la diferencia entre let y var? ¿Y entre un struct y una class en Swift? ¿Por qué SwiftUI usa struct para las vistas y no class?

📋 Mini resumen

Xcode es el IDE de Apple, solo en macOS, gratuito, con 5 paneles. Swift: let/var, Optionals (? y !), struct para tipos valor, enum con valores asociados, protocolos como contratos. async/await para código asíncrono limpio. Deployment target iOS 15+ para async/await.

03
UIKit vs SwiftUI
Paradigmas · @State · MVVM · Interoperabilidad

🆚 Dos generaciones de desarrollo iOS

iOS tiene dos frameworks de interfaz de usuario: UIKit, el original (2008), y SwiftUI, el moderno (2019). No son excluyentes — pueden coexistir en la misma app.

AspectoUIKitSwiftUI ✅ recomendado
ParadigmaImperativo — describes cómo construir la UIDeclarativo — describes qué mostrar
Introducido eniOS 2 (2008) — maduro y estableiOS 13 (2019) — moderno, en evolución
HerramientasSwift/Obj-C + Storyboards/XIBSolo Swift — sin ficheros de interfaz visual
Preview en tiempo realSolo con simulador arrancadoCanvas en Xcode actualiza en milisegundos
Soporte multiplataformaSolo iOS / iPadOSiOS, macOS, watchOS, tvOS, visionOS
Recomendación AppleProyectos heredadosTodos los proyectos nuevos iOS 15+
📱 Analogía

UIKit es imperativo: como dar instrucciones paso a paso a un camarero («trae el menú, ponlo sobre la mesa, llena el vaso de agua, trae la carta...»). SwiftUI es declarativo: como pedir el resultado final («quiero una mesa preparada para cenar»). El framework decide cómo conseguirlo.

🔧 UIKit — Imperativo
// Crear botón manualmente let boton = UIButton(type: .system) boton.setTitle("Pulsar", for: .normal) boton.frame = CGRect(x: 0, y: 0, w: 200, h: 44) boton.addTarget(self, action: #selector(pulsado), for: .touchUpInside) view.addSubview(boton) @objc func pulsado() { label.text = "¡Pulsado!" }
✨ SwiftUI — Declarativo
// Todo en una vista declarativa @State var texto = "Pulsar" var body: some View { Button(texto) { texto = "¡Pulsado!" } .buttonStyle(.borderedProminent) .padding() } // La UI se actualiza sola // cuando @State cambia

🔮 SwiftUI: vistas, estado y datos

La clave de SwiftUI es la reactividad automática: cuando el estado (@State) cambia, la vista se reconstruye automáticamente. No hay que «actualizar la UI manualmente».

// Vista SwiftUI completa con @State
struct ContentView: View {
    @State private var contador = 0
    @State private var nombre = ""
    
    var body: some View {
        NavigationStack {
            VStack(spacing: 20) {
                Text("Contador: \(contador)")
                    .font(.largeTitle)
                    .foregroundStyle(.blue)
                
                HStack {
                    Button("-") { contador -= 1 }
                        .buttonStyle(.bordered)
                    Button("+") { contador += 1 }
                        .buttonStyle(.borderedProminent)
                }
                
                TextField("Tu nombre", text: $nombre)
                    .textFieldStyle(.roundedBorder)
                
                if !nombre.isEmpty {
                    Text("Hola, \(nombre)!")
                        .transition(.opacity)
                }
            }
            .navigationTitle("Mi App")
        }
    }
}
💡 @State: la fuente de verdad

@State es la propiedad de datos local de una vista. Cuando su valor cambia, SwiftUI recalcula automáticamente el body y actualiza solo lo que ha cambiado. El signo $ crea un binding bidireccional: cuando el TextField escribe, $nombre actualiza la variable y viceversa.

🏗️ MVVM con @Observable (iOS 17+)

Para apps más complejas, el patrón MVVM (Model-View-ViewModel) separa la lógica de negocio de la interfaz de usuario. El ViewModel gestiona el estado y las llamadas a la API; la Vista solo muestra lo que el ViewModel expone.

// ViewModel con @Observable (Swift 5.9, iOS 17+)
@Observable class UserViewModel {
    var users: [User] = []
    var isLoading = false
    var errorMessage: String?
    
    func loadUsers() async {
        isLoading = true
        defer { isLoading = false }
        do {
            users = try await UserService.fetchAll()
        } catch {
            errorMessage = error.localizedDescription
        }
    }
}

// Vista: solo renderiza, nunca contiene lógica
struct UsersView: View {
    @State private var vm = UserViewModel()
    
    var body: some View {
        Group {
            if vm.isLoading {
                ProgressView("Cargando...")
            } else {
                List(vm.users) { user in
                    Text(user.name)
                }
            }
        }
        .task { await vm.loadUsers() }
    }
}

Componentes UI principales en SwiftUI:

Componente SwiftUIEquivalente UIKitUso
Text("Hola")UILabelMostrar texto estático o dinámico
TextField("label", text: $var)UITextFieldEntrada de texto del usuario
Button("Acción") { }UIButtonAcción pulsable
Image("nombre")UIImageViewImagen local o de sistema (SF Symbols)
List { ForEach(items) { } }UITableViewLista scrollable de ítems
LazyVGrid(columns: ...) { }UICollectionViewCuadrícula adaptable
NavigationStack → NavigationLinkUINavigationControllerNavegación entre pantallas
.sheet(isPresented: $show) { }present(_:animated:)Modal / hoja emergente
⚠️ Error frecuente

Poner lógica de negocio (llamadas a APIs, transformaciones de datos) directamente en el body de la vista. La vista solo debe mostrar datos — toda la lógica va en el ViewModel. Si el body tiene más de 50 líneas, algo falla en la arquitectura.

Interoperabilidad: mezclar UIKit y SwiftUI:

// UIKit dentro de SwiftUI — UIViewRepresentable
struct MapaView: UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }
    func updateUIView(_ uiView: MKMapView, context: Context) {
        // actualizar cuando cambia el estado SwiftUI
    }
}

// SwiftUI dentro de UIKit — UIHostingController
class MiViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let hostingVC = UIHostingController(rootView: ContentView())
        addChild(hostingVC)
        view.addSubview(hostingVC.view)
        hostingVC.didMove(toParent: self)
    }
}
🙋 Pregunta para el alumno

¿Por qué Apple recomienda SwiftUI para los proyectos nuevos pero sigue manteniendo UIKit? ¿Qué ventaja tiene UIHostingController para las empresas con apps UIKit antiguas?

📋 Mini resumen

UIKit = imperativo, iOS 2, Storyboards. SwiftUI = declarativo, iOS 13, solo código Swift. @State hace la UI reactiva. @Observable (iOS 17) implementa MVVM limpiamente. UIViewRepresentable integra vistas UIKit en SwiftUI. UIHostingController hace lo contrario. Apple recomienda SwiftUI para todo nuevo desde iOS 15+.

04
Publicación en App Store
Checklist · Proceso · Revisión · ASO

📋 Checklist pre-lanzamiento

Antes de enviar la app a revisión, hay que cumplir todos estos requisitos. Un solo punto incumplido puede causar rechazo. Apple comprueba cada uno manualmente.

🔧 Aspectos técnicos

  • Certificado de distribución activo
  • Provisioning Profile de producción
  • 0 errores de compilación
  • Build para todos los dispositivos objetivo
  • Permisos NSUsage en Info.plist con descripción
  • Probado en dispositivo físico real

🎨 Metadatos y assets

  • Icono 1024×1024px sin transparencia
  • Capturas para 6.5" y 5.5"
  • Nombre máx. 30 chars + keyword principal
  • Subtítulo máx. 30 chars
  • Descripción máx. 4.000 chars
  • Privacy Nutrition Label completa y precisa

🔢 Proceso de publicación — 7 pasos

1. Apple Developer Program
developer.apple.com → Enroll → $99 USD/año → acceso a Xcode firmado + ASC
2. Crear Bundle ID
developer.apple.com/account → App Identifier con Bundle ID único (com.empresa.nombre)
3. Crear App en ASC
appstoreconnect.apple.com → Apps → '+' → iOS App → Bundle ID → Nombre → SKU
4. Archive en Xcode
Product → Archive → Validate App → Distribute App → App Store Connect → Upload
5. TestFlight (beta)
Subir build → TestFlight → Probadores internos/externos → feedback antes del lanzamiento
6. Metadatos y precios
Descripción, capturas, palabras clave, categoría, política de privacidad (URL obligatoria)
7. Enviar a revisión
Add for Review → Submit for Review → cola de revisión Apple (1–7 días)

📊 Estados del proceso de revisión

EstadoSignificado
⏳ Waiting for ReviewEn cola — espera su turno para ser revisada por Apple
👁️ In ReviewActivamente siendo revisada por el equipo de Apple
✅ Pending Developer ReleaseAprobada — el desarrollador controla la fecha de publicación
🟢 Ready for SalePublicada y visible en la App Store para los usuarios
❌ RejectedRechazada — hay que corregir los problemas y volver a enviar
📝 Metadata RejectedSolo los metadatos son incorrectos — no necesita nueva build
⚠️ Motivos comunes de rechazo
  • Funcionalidad incompleta: pantallas en blanco, botones que no funcionan, contenido de demo
  • Privacidad: datos recogidos no declarados en la Privacy Nutrition Label
  • Pagos in-app: compras digitales que no usan StoreKit (obligatorio al 100%)
  • Metadatos engañosos: capturas que muestran funciones que la app no tiene
  • Crashes: un crash durante la revisión de Apple = rechazo inmediato
  • Diseño: no seguir las Human Interface Guidelines de Apple

🔍 ASO: App Store Optimization

ASO es el proceso de optimizar la ficha de la app para mejorar su visibilidad orgánica en los resultados de búsqueda y aumentar la conversión de visitas a descargas.

Factor ASOLímiteEstrategia
Nombre de la app30 charsKeyword principal al principio. Diferenciador claro.
Subtítulo30 charsComplementa el nombre con keywords secundarias.
Keywords field100 charsSin espacios tras comas, sin repetir keywords del nombre.
Descripción4.000 charsLos primeros 3 párrafos son los más leídos (antes del «más»).
Capturas de pantalla3–10La primera captura decide la descarga. Añadir texto explicativo.
Ratings y reseñasAlgorítmicoSolicitar con SKStoreReviewRequest. Responder a 1-2 estrellas.
Ícono1024×1024pxReconocible a 60×60px. Sin texto. Sin transparencia.
LocalizaciónPor idiomaLocalizar metadatos amplía significativamente la audiencia global.

Importancia relativa de los factores ASO:

📛 Nombre y KeywordsImpacto en búsqueda: muy alto
📸 Capturas y vídeoConversión: muy alto
⭐ Rating y reseñasConfianza: alto
🎨 ÍconoPrimera impresión: alto
📝 DescripciónLectura: medio
TareaTiempo estimado
Inscripción Apple Developer1–3 días (verificación de identidad)
Preparar metadatos y assets1–3 días (diseño capturas, traducciones)
TestFlight (beta interna)Instantáneo tras revisión automática
Revisión App Store (primera vez)24h – 7 días (puede tardar más)
Revisión (actualizaciones)24h – 48h
🙋 Pregunta para el alumno

Redacta el nombre (30 chars) y el subtítulo (30 chars) para una app de meditación con IA. ¿Qué keywords incluirías en el campo de keywords (100 chars)? Justifica tus elecciones.

📋 Mini resumen

Checklist: firma + 0 errores + assets + privacidad. 7 pasos: Developer Program → Bundle ID → crear app → Archive → TestFlight → metadatos → enviar a revisión. Estados: Waiting → In Review → Pending → Ready for Sale (o Rejected). ASO: nombre + capturas + ratings son los factores de mayor impacto.

🏋️
Actividades Prácticas
7 ejercicios para consolidar el aprendizaje

Ejercicios en orden creciente de complejidad. Pueden realizarse en clase o como tarea.

1
Hello World iOS
Crear un nuevo proyecto Xcode con SwiftUI. Añadir: Text con «Hola mundo», un Button que cambie el texto al pulsarlo y un TextField con @State. Ejecutar en simulador.

Objetivo: familiarizarse con el ciclo Xcode.
2
Swift Playground
Crear un Swift Playground y practicar: optionals con if let y guard let, struct con computed properties, enum con valores asociados, y una función async/await que simule una llamada de red.
3
Lista con navegación
Implementar una List de películas (array de structs) con NavigationStack y NavigationLink. La pantalla de detalle muestra toda la información del ítem seleccionado.

Estructura: struct Película con título, año, sinopsis.
4
Llamada a API REST
Usar URLSession con async/await para consumir jsonplaceholder.typicode.com/posts. Mostrar posts en una List. Implementar ProgressView mientras carga y manejo de errores.
5
TestFlight
Configurar el Apple Developer Program (o cuenta gratuita para simulador), archivar la app con Product → Archive y distribuirla a probadores internos vía TestFlight. Documentar el proceso.
6
Ficha de App Store
Redactar los metadatos completos de una app inventada: nombre (30 chars), subtítulo (30 chars), 5 keywords para el campo de keywords (100 chars total) y descripción de 500 palabras optimizada para ASO.
7
UIViewRepresentable
Integrar MKMapView de MapKit (UIKit) dentro de una vista SwiftUI usando UIViewRepresentable. Mostrar la ubicación actual del usuario en el mapa.

💬 Reflexiones rápidas para clase

📝 Explica con tus palabras
¿Por qué un Optional en Swift es más seguro que un null en Java o Kotlin? ¿Qué error elimina?
🔗 Relaciona con app real
¿Qué apps de tu iPhone crees que están hechas con SwiftUI? ¿Cuáles siguen usando UIKit? ¿Cómo podrías saberlo?
🔍 Detecta el error
Un alumno pone toda la lógica de llamada a la API dentro del body de su SwiftUI View. ¿Qué problema tiene esto? ¿Cómo lo corriges?
🏗️ Completa el esquema
Dibuja el flujo completo desde que pulsas «Submit for Review» en ASC hasta que el usuario puede descargar la app.
📖
Glosario de términos
Definiciones claras de todos los conceptos técnicos del tema
Swift
Lenguaje de programación de Apple (2014). Compila a ARM nativo. Seguro, rápido y moderno. Sucesor de Objective-C.
SwiftUI
Framework de interfaz declarativa de Apple (iOS 13+). Reemplaza progresivamente a UIKit. Multiplatforma en el ecosistema Apple.
UIKit
Framework de interfaz imperativa original de Apple (iOS 2, 2008). Sigue siendo necesario para apps heredadas y funciones avanzadas.
Xcode
IDE oficial de Apple para desarrollar para todo el ecosistema (iPhone, iPad, Mac, Watch, TV). Solo disponible en macOS. Gratuito.
Optional (Swift)
Tipo que puede contener un valor o nil. Se declara con ?. Obliga al desarrollador a manejar el caso nil explícitamente, eliminando null pointer exceptions.
if let / guard let
Sintaxis de Swift para desenvolver (unwrap) un Optional de forma segura. if let crea un scope. guard let hace early exit si el valor es nil.
Nil coalescing (??)
Operador Swift que devuelve el valor de un Optional si existe, o un valor por defecto si es nil. Ej: valor ?? "por defecto".
let / var
let = constante inmutable (preferido siempre). var = variable mutable (solo cuando cambia). El compilador advierte si declaras var innecesariamente.
struct
Tipo valor en Swift: se copia al asignarse o pasarse. SwiftUI usa structs para todas las vistas. Más eficiente que class para datos inmutables.
class
Tipo referencia en Swift: se pasa por referencia (apunta al mismo objeto en memoria). Usado en ViewModels (@Observable) y código heredado.
Protocolo
Contrato que define qué métodos/propiedades debe implementar un tipo. Equivalente a interface en Java/Kotlin.
Enum (Swift)
Tipo que define un conjunto de valores posibles. En Swift, los enums pueden tener valores asociados de cualquier tipo, lo que los hace muy potentes.
async/await
Sintaxis de Swift 5.5+ para código asíncrono sin callbacks ni completion handlers. Hace el código asíncrono tan legible como el síncrono.
async let
Permite lanzar múltiples tareas asíncronas en paralelo y esperar todas a la vez. Equivalente a Promise.all() en JavaScript.
Actor
Tipo de Swift que protege sus datos del acceso concurrente. Garantiza acceso secuencial aunque múltiples hilos intenten acceder simultáneamente.
@State
Property wrapper de SwiftUI para estado local de una vista. Cuando cambia, SwiftUI recalcula el body automáticamente.
@Observable
Macro de Swift 5.9 (iOS 17+) que hace una clase observable por SwiftUI automáticamente. Reemplaza @ObservableObject + @Published.
Binding ($)
Referencia bidireccional a un @State. Permite a una subvista leer y escribir el estado de la vista padre. Se crea con el prefijo $.
MVVM (Model-View-ViewModel)
Patrón arquitectónico preferido en SwiftUI. El ViewModel gestiona el estado y la lógica; la Vista solo renderiza. El Modelo son los datos.
NavigationStack
Componente SwiftUI (iOS 16+) para gestionar una pila de vistas con navegación hacia adelante y atrás. Reemplaza NavigationView.
UIViewRepresentable
Protocolo de SwiftUI para envolver una vista UIKit y usarla en un contexto SwiftUI. Necesario para MKMapView, WKWebView, etc.
UIHostingController
UIViewController especial que aloja una vista SwiftUI dentro de una app UIKit existente. Permite adoptar SwiftUI gradualmente.
SF Symbols
Biblioteca de más de 5.000 iconos del sistema Apple, accesibles con Image(systemName: "nombre"). Escalan con la tipografía y respetan el modo oscuro.
App Store Connect (ASC)
Portal web de Apple para gestionar apps publicadas: metadatos, TestFlight, precios, ventas y estadísticas.
Apple Developer Program
Suscripción de $99 USD/año necesaria para publicar apps en la App Store y acceder a certificados de distribución.
Bundle ID
Identificador único de la app en el ecosistema Apple. Formato com.empresa.nombre. No puede cambiarse una vez publicada la app.
Archive (Xcode)
Proceso de compilación optimizada que empaqueta la app firmada para distribución. Product → Archive es el primer paso para publicar.
TestFlight
Plataforma de Apple para distribución beta. Permite hasta 10.000 probadores externos antes del lanzamiento oficial en App Store.
Privacy Nutrition Label
Sección de la ficha App Store donde el desarrollador declara qué datos recoge la app, con qué propósito y si se comparten con terceros.
Human Interface Guidelines (HIG)
Guía de diseño de Apple que define los principios visuales e interactivos que todas las apps deben seguir para ser aprobadas.
StoreKit / IAP
Framework de Apple obligatorio para procesar compras in-app y suscripciones. Apple cobra 15-30% de comisión.
SKStoreReviewRequest
API de Apple para solicitar a los usuarios que valoren la app. Máximo 3 veces por año. Apple controla si el diálogo se muestra.
ASO (App Store Optimization)
Proceso de optimizar la ficha de la app (nombre, keywords, capturas) para mejorar la visibilidad orgánica en búsquedas de la App Store.
Provisioning Profile
Archivo que vincula tu app (Bundle ID), tu cuenta de desarrollador y los dispositivos autorizados a ejecutarla. Necesario para distribución.
Deployment Target
Versión mínima de iOS que la app soporta. iOS 16 cubre ~95% de dispositivos activos (2024). Recomendado para nuevos proyectos.
Apple Silicon (ARM)
Chips propios de Apple (M1, M2, M3, M4, A-series) basados en arquitectura ARM. Todos los dispositivos Apple modernos los usan, unificando la plataforma.
Resumen del Tema 6
Desarrollo iOS de principio a fin

El desarrollo para iPhone es mucho más que aprender un lenguaje nuevo — es acceder al ecosistema más cohesionado de dispositivos del mundo:

01
Familia iOS
iPhone, iPad, Mac, Watch, TV y Vision Pro bajo Swift y SwiftUI. iOS 29% global pero 2-3× más ingresos por usuario. 95% actualiza en 2 años.
02
Xcode y Swift
Xcode solo en macOS, gratuito, 5 paneles. Swift: let/var, Optionals seguros, structs, enums con valores asociados, protocolos, async/await.
03
UIKit vs SwiftUI
UIKit = imperativo (iOS 2). SwiftUI = declarativo (iOS 13), recomendado para todo nuevo. @State reactivo, MVVM con @Observable, UIViewRepresentable para interoperabilidad.
04
App Store
$99/año + checklist técnico + 7 pasos. Revisión 1-7 días. Motivos de rechazo: crashes, privacidad, pagos no StoreKit. ASO: nombre + capturas + ratings.
Conclusión del tema

Aprender iOS no es solo aprender Swift. Es aprender a pensar de forma declarativa con SwiftUI, a tratar la nulidad como un ciudadano de primera con Optionals, y a respetar un proceso de publicación estricto que garantiza la calidad que los usuarios de Apple esperan. Un ecosistema exigente que recompensa con los usuarios más fieles y de mayor poder adquisitivo del mundo móvil.

🔗 Recursos oficiales

🍎 Apple Developer Docs
developer.apple.com/documentation — Documentación completa de todos los frameworks Apple.
📖 Swift Language Guide
docs.swift.org/swift-book — Guía oficial del lenguaje Swift.
🎓 SwiftUI Tutorials
developer.apple.com/tutorials/swiftui — Tutoriales interactivos oficiales de Apple.
📋 App Store Guidelines
developer.apple.com/app-store/review/guidelines — Directrices completas de revisión.
🎨 Human Interface Guidelines
developer.apple.com/design/human-interface-guidelines — Guía de diseño para todas las plataformas.
🔣 SF Symbols
developer.apple.com/sf-symbols — Más de 5.000 iconos del sistema Apple listos para usar.