Aprende todo el stack
Guía de Estudio
Cada tema central de iOS, explicado desde los primeros principios y planteado como lo pide una entrevista. Lee el concepto, luego la nota de nivel para saber si es lo mínimo indispensable o algo que te diferencia.
01 · Fundamentos del Lenguaje Swift
Qué es. Swift es un lenguaje orientado a valores y tipado de forma segura. La idea más
importante para interiorizar temprano es tipos por valor vs tipos por referencia: struct y
enum se copian al asignar (semántica de valor), mientras que las instancias de class
se comparten por referencia. SwiftUI se apoya fuertemente en tipos por valor, así que use struct
por defecto y recurrirá a class solo cuando necesite identidad o semántica de referencia.
Fluidez básica que la entrevista asume: optionals (y desenvoltura segura con if let /
guard let en lugar de desenvoltura forzada con !), enums con valores
asociados, closures y cómo capturan, protocolos y diseño orientado a protocolos,
genéricos y manejo de errores con do/try/catch.
self fuertemente dentro de una propiedad almacenada crea un retain
cycle — rompalo con [weak self]. Esta es una pregunta clásica de seguimiento para
senior.02 · Fundamentos de SwiftUI
Qué es. SwiftUI es un framework de UI declarativo: describe cómo debería verse la UI
para un estado dado, y el framework diff y actualiza la pantalla cuando el estado cambia. Una vista es un
struct ligero que cumple con View con un body que retorna más
vistas.
Domine los modificadores (y que el orden importa — .padding().background()
difiere de .background().padding()), el layout con VStack/HStack/
ZStack, Spacer, frame y alineación, y las listas con
List y ForEach con clave por identidad estable.
ForEach, use un id estable (un id real del modelo, no el índice del array) o las
animaciones y el estado se adherirán a la fila incorrecta.03 · Estado y Flujo de Datos en SwiftUI
Qué es. SwiftUI está impulsado por una única fuente de verdad. Elija el wrapper de propiedad adecuado para quién posee el estado:
@State— valor poseído por esta vista (privado, estado UI transitorio).@Binding— una referencia bidireccional al estado poseído en otro lugar.@Observable(el framework de Observación, iOS 17+) — modelo de tipo referencia cuyas propiedades las vistas observan automáticamente; combine con@Statepara poseerlo y@Bindablepara vincularse a él.@Environment— dependencias inyectadas hacia abajo en el árbol de vistas.
Antes de iOS 17 esto era ObservableObject + @Published + @StateObject/
@ObservedObject; conozca ambos, porque mucho código todavía usa la API anterior.
@Published,
que invalidaba todos los observadores.04 · UIKit e Interoperabilidad
Qué es. UIKit es el framework de UI imperativo y maduro que impulsó iOS durante una década.
Incluso en una app SwiftUI-first lo necesita para APIs que SwiftUI no cubre completamente, personalización
profunda y bases de código existentes grandes. Conozca el ciclo de vida de UIViewController
(viewDidLoad → viewWillAppear → viewDidAppear → …), las restricciones de Auto Layout,
y UITableView/UICollectionView con diffable data sources.
El puente funciona en ambas direcciones: envuelva UIKit en SwiftUI con UIViewRepresentable /
UIViewControllerRepresentable, y aloje SwiftUI dentro de UIKit con
UIHostingController.
05 · Concurrencia de Swift
Qué es. La concurrencia asíncrona moderna de iOS se construye sobre async/await y la
concurrencia estructurada. Las funciones async se suspenden sin bloquear un hilo;
Task inicia trabajo concurrente; async let y TaskGroup ejecutan hijos
en paralelo y los unen. Los actors protegen el estado mutable de carreras de datos serializando el
acceso, y @MainActor garantiza que el código se ejecute en el hilo principal (requerido para
UI).
Swift 6 convierte esto en seguridad contra carreras de datos en tiempo de compilación: los tipos
que cruzan límites de concurrencia deben ser Sendable, y el compilador aplica el aislamiento
de actors. Entender el aislamiento, Sendable y @MainActor es la conversación de
concurrencia para senior.
DispatchQueue.main.async
por hábito — use @MainActor. Y nunca bloquee el actor principal con trabajo síncrono; muévalo
fuera con un Task o un actor de fondo.@MainActor.
Senior: explicar el aislamiento de actors, Sendable, cancelación y cómo migrar una API basada
en callbacks a async con withCheckedContinuation.06 · Red y Codable
Qué es. El stack estándar es la API asíncrona de URLSession más
Codable para JSON. Codable (= Encodable & Decodable) mapea JSON a tipos
Swift automáticamente; use CodingKeys para renombrar campos y estrategias de decodificador
(por ejemplo .convertFromSnakeCase, decodificación de fechas personalizada) para manejar
payloads del mundo real.
APIClient) para que los view models dependan de una abstracción que puede mockear en pruebas.
Agregue caché en capas con URLCache o su tienda de persistencia, y centralice la lógica de
reintento/renovación de auth.07 · Persistencia
Qué es. Elija el almacenamiento según los datos: SwiftData (iOS 17+) para modelos de
app — anote una clase con @Model, guarde a través de un ModelContext y consulte
reactivamente con @Query; Core Data para objetivos más antiguos o control avanzado;
UserDefaults para preferencias pequeñas; el Keychain para secretos (tokens, contraseñas —
nunca UserDefaults); y el sistema de archivos para blobs.
UserDefaults — es un plist sin cifrar. Use el Keychain (véase Seguridad, tema
14).08 · Navegación y Estructura de la App
Qué es. El punto de entrada de una app es un struct que cumple con App
con @main, componiendo Scenes (usualmente un WindowGroup). Para la
navegación, NavigationStack con navigationDestination reemplazó al antiguo
NavigationView y habilita la navegación programática basada en valores: vincule un
array path y haga push/pop mutándolo. TabView maneja las secciones de nivel
superior, y los deep links mapean un URL sobre esa ruta.
Route que se agregan a path. Ese es el encuadre senior — navegación como
datos.09 · Rendimiento e Instruments
Qué es. El trabajo de rendimiento se trata principalmente de hacer menos: menos
re-renders, menos asignaciones, menos trabajo en el hilo principal. En SwiftUI eso significa mantener
body ligero y puro (sin cálculos pesados, sin efectos secundarios), dar a las vistas identidad
estable, usar LazyVStack/LazyHStack y List para contenido largo, y
dejar que el framework de Observación re-renderice solo las vistas que leen una propiedad modificada.
Mida con Instruments: Time Profiler para puntos calientes de CPU, Allocations/Leaks para memoria y retain cycles, el instrumento SwiftUI para conteo de view-body, y Hangs para bloqueos del hilo principal. Regla uno: perfile antes de optimizar — las suposiciones suelen estar equivocadas.
body; cargar imágenes de resolución completa en miniaturas pequeñas (reduzca la resolución
primero); retain cycles de closures que capturan self; y bloquear el actor principal con E/S
síncrona.10 · Pruebas
Qué es. Hoy se shippean dos frameworks de pruebas unitarias: el establecido XCTest y el
más nuevo Swift Testing (funciones @Test con macros #expect/#require,
pruebas parametrizadas y soporte asíncrono), introducido con Xcode 16. Los flujos de UI se cubren con
XCUITest. Lo que las entrevistas sondean es la testeabilidad: inyecte dependencias detrás de
protocolos para poder sustituir fakes, y mantenga la lógica en view models en lugar de vistas.
APIClient, no de URLSession, por lo que el view model toma un mock en pruebas y
se ejecuta sin red." Esa una oración señala que usted diseña para testeabilidad.11 · Dependencias y Swift Package Manager
Qué es. Swift Package Manager (SPM) es la forma nativa de agregar dependencias y —
igualmente importante — de modularizar su propia app en paquetes locales. Un manifiesto
Package.swift declara targets (código) y productos (lo que expone). Dividir una funcionalidad en
su propio paquete fuerza límites, acelera compilaciones incrementales y permite que las funcionalidades se
prueben de forma aislada. CocoaPods y Carthage todavía existen en proyectos legacy, pero SPM es el
predeterminado para trabajo nuevo.
12 · CI/CD y Lanzamiento
Qué es. Un pipeline repetible que construye, prueba, firma y distribuye cada cambio. Xcode Cloud es el CI alojado de Apple integrado con App Store Connect; Fastlane es el estándar de automatización multiplataforma (y se ejecuta en GitHub Actions, etc.). La parte que complica a todos es el firma de código: los certificados identifican al equipo, los provisioning profiles vinculan un app id + dispositivos + certificado juntos. El firmado automático maneja el caso común; los equipos suelen gestionarlo explícitamente (por ejemplo, Fastlane match) para credenciales compartidas y reproducibles.
CFBundleShortVersionString) del número de build (CFBundleVersion, debe
incrementarse por carga). Respuesta senior: los PR ejecutan pruebas unitarias + de UI en CI; merges a main
envían automáticamente un build de TestFlight; los lanzamientos se promueven con un phased rollout.13 · Revisión de App Store y Distribución
Qué es. El lanzamiento se realiza a través de App Store Connect: cargue un build, complete los metadatos y capturas de pantalla, complete App Privacy (la "etiqueta de nutrición" de privacidad) y envíe para revisión según las App Store Review Guidelines. Las pruebas beta se realizan a través de TestFlight. Conozca las razones de rechazo comunes para poder evitarlas: funcionalidad rota/incompleta, problemas de privacidad (cadenas de descripción de uso faltantes, recopilación de datos no revelada), metadatos engañosos y uso de APIs privadas.
- Phased release implementa una actualización a un % creciente de usuarios durante ~7 días — pause si las tasas de crash aumentan.
- Los privacy manifests y las APIs de razón requerida deben declararse (véase Seguridad, tema 14).
- StoreKit maneja las compras en app y suscripciones; Apple requiere IAP para bienes digitales.
14 · Seguridad y Privacidad
Qué es. Almacene secretos en el Keychain (cifrado, respaldado por hardware), nunca en
UserDefaults. Proteja flujos sensibles con biometría a través del framework
LocalAuthentication (Face ID / Touch ID). Mantenga App Transport Security (solo HTTPS) activado.
Use clases de protección de datos para que los archivos estén cifrados en reposo cuando el
dispositivo esté bloqueado. Respete la privacidad: declare un privacy manifest
(PrivacyInfo.xcprivacy) y el uso de APIs de razón requerida, y solicite permiso de rastreo
a través de App Tracking Transparency antes de usar el IDFA.
15 · IA en el Dispositivo y Machine Learning
Qué es. La ML de Apple se ejecuta en el dispositivo por privacidad, baja latencia y uso
sin conexión, acelerada por el Neural Engine. La caja de herramientas: Core ML (ejecutar modelos
entrenados), Create ML (entrenar sin salir de Swift) y frameworks de tareas — Vision
(imágenes), Natural Language (texto), Speech (transcripción) y Sound Analysis.
Apple Intelligence lleva esto más lejos con funciones generativas a nivel de sistema y modelos
fundamentales en el dispositivo. Convierta modelos de terceros a Core ML con coremltools, y
optimice (cuantice, poda) para ajustar a presupuestos de memoria y latencia.