Tutoriales de SwiftUI y Swift para iOS Developers - PROGRAMACIONSWIFT.COM

Preguntas y respuestas de SwiftUI para entrevistas

Si estás preparándote para dar el salto en tu carrera como iOS Developer, dominar los conceptos técnicos es fundamental. Las entrevistas técnicas pueden ser un desafío, especialmente con la rápida evolución del ecosistema de Apple. En este artículo, hemos recopilado la lista más completa de preguntas y respuetas de SwiftUI para entrevista, abarcando desde los fundamentos de la programación Swift hasta los secretos mejor guardados de Xcode y la arquitectura de aplicaciones.

Tanto si eres un desarrollador junior buscando tu primera oportunidad, como un senior repasando conceptos, esta guía rápida te ayudará a repasar todo lo que necesitas saber sobre Swift y SwiftUI.

Fundamentos de la programación Swift

  1. ¿Qué diferencia hay entre let y var en Swift? let declara una constante inmutable, mientras que var declara una variable cuyo valor puede cambiar.
  2. ¿Cuál es la diferencia entre un struct y una class? Los structs son tipos por valor (se copian) y las classes son tipos por referencia (comparten la misma instancia).
  3. ¿Qué es un Optional en Swift? Es un tipo que representa la posibilidad de que una variable tenga un valor o sea nil.
  4. ¿Qué es el operador nil-coalescing (??)? Proporciona un valor por defecto si el Optional evaluado es nil.
  5. ¿Qué diferencia hay entre guard let y if let? guard let requiere un retorno temprano si la condición falla, manteniendo la variable disponible en el ámbito exterior; if let solo hace disponible la variable dentro de su bloque.
  6. ¿Qué es una tupla? Es un grupo ordenado de valores múltiples de cualquier tipo, tratados como un único valor compuesto.
  7. ¿Para qué sirve typealias? Permite crear un nombre alternativo para un tipo de dato existente para mejorar la legibilidad del código.
  8. ¿Qué es un enum? Es un tipo que define un grupo de valores relacionados y permite trabajar con ellos de forma segura.
  9. ¿Qué son los raw values en un enum? Son valores predeterminados (como enteros o cadenas) asignados a cada caso del enum.
  10. ¿Qué son los associated values en un enum? Permiten almacenar información adicional de diferentes tipos junto a cada caso específico del enum.

Funciones y Closures en Swift

  1. ¿Qué es un closure? Es un bloque de código autocontenido que puede ser pasado y utilizado en tu código, similar a las funciones anónimas.
  2. ¿Qué significa @escaping en un closure? Indica que el closure será ejecutado después de que la función que lo recibe haya retornado.
  3. ¿Qué es un @autoclosure? Es un closure que se crea automáticamente para envolver una expresión que se pasa como argumento, retrasando su evaluación.
  4. ¿Qué es un trailing closure? Es una sintaxis que permite escribir el closure fuera de los paréntesis de la función si es el último parámetro.
  5. ¿Qué hace la función map? Aplica un closure a cada elemento de una colección y devuelve una nueva colección con los resultados.
  6. ¿Qué hace la función filter? Devuelve una nueva colección con los elementos que cumplen una condición específica.
  7. ¿Qué hace la función reduce? Combina todos los elementos de una colección en un solo valor utilizando un closure proporcionado.
  8. ¿Qué diferencia hay entre map y compactMap? compactMap hace lo mismo que map, pero elimina automáticamente los valores nil del resultado.
  9. ¿Qué hace flatMap? Transforma los elementos y aplana estructuras anidadas (como un array de arrays) en una sola colección.
  10. ¿Para qué sirve inout en los parámetros de una función? Permite modificar el valor de un parámetro por valor dentro de la función y que el cambio persista fuera de ella.

Programación Orientada a Objetos y Protocolos

  1. ¿Qué es un protocolo en Swift? Es un plano o contrato que define métodos y propiedades que una clase, estructura o enum debe implementar.
  2. ¿Qué son las extensiones de protocolo? Permiten proporcionar implementaciones por defecto a los métodos de un protocolo.
  3. ¿En qué consiste el patrón Delegate? Es un patrón de diseño donde un objeto delega parte de sus responsabilidades a otro objeto a través de un protocolo.
  4. ¿Qué son los genéricos (Generics)? Permiten escribir código flexible y reutilizable que puede trabajar con cualquier tipo, sujeto a ciertos requisitos.
  5. ¿Qué es un associatedtype en un protocolo? Es un marcador de posición para un tipo que se definirá más adelante cuando se adopte el protocolo.
  6. ¿Qué significa some View (Opaque Types)? Oculta el tipo de retorno exacto de una función, indicando que devuelve “algún” tipo que cumple con el protocolo View.
  7. ¿Para qué sirve una extension? Permite añadir nuevas funcionalidades (métodos, propiedades calculadas) a un tipo existente.
  8. ¿Qué niveles de control de acceso existen? openpublicinternalfileprivate, y private.
  9. ¿Cuál es la diferencia entre open y public? open permite que las clases sean heredadas y los métodos sobrescritos fuera del módulo, public no.
  10. ¿Qué significa la palabra clave final? Impide que una clase sea heredada o que un método sea sobrescrito.

Memoria y ARC (Automatic Reference Counting)

  1. ¿Qué es ARC? Es el sistema que usa Swift para gestionar la memoria, liberando automáticamente los objetos cuando ya no son referenciados.
  2. ¿Cuál es la diferencia entre referencias strong y weak? strong incrementa el contador de referencias protegiendo al objeto de ser liberado; weak no incrementa el contador y puede convertirse en nil.
  3. ¿Qué es unowned? Es similar a weak, pero asume que el objeto referenciado nunca será nil mientras se esté utilizando.
  4. ¿Qué es un retain cycle (ciclo de retención)? Ocurre cuando dos objetos tienen referencias strong mutuas, impidiendo que ARC los libere de la memoria.
  5. ¿Por qué usamos [weak self] en closures? Para evitar ciclos de retención cuando el closure captura al propio objeto self.
  6. ¿Qué es una capture list? Es un arreglo escrito entre corchetes al inicio de un closure que define las reglas (ej. weak o unowned) de cómo se capturan las variables.
  7. ¿Qué es deinit? Es un bloque de código en una clase que se ejecuta justo antes de que el objeto sea destruido por ARC.
  8. ¿Qué es una variable lazy? Es una propiedad cuyo valor inicial no se calcula hasta la primera vez que se accede a ella.
  9. ¿Qué son willSet y didSet? Son observadores de propiedades que ejecutan código justo antes o inmediatamente después de que el valor de una propiedad cambie.
  10. ¿Qué es una propiedad calculada (computed property)? Es una propiedad que no almacena un valor, sino que proporciona un getter (y opcionalmente un setter) para calcularlo al vuelo.

Fundamentos de SwiftUI

  1. ¿Qué es SwiftUI? Es el framework declarativo de Apple para construir interfaces de usuario en todas sus plataformas.
  2. ¿Qué es el protocolo View? Es el protocolo central en SwiftUI; todo elemento visual debe conformar este protocolo e implementar la propiedad body.
  3. ¿Por qué body devuelve some View? Porque utiliza tipos opacos, permitiendo al compilador conocer el tipo exacto sin exponer la compleja jerarquía de tipos subyacente.
  4. ¿Qué son los Modifiers (modificadores)? Son métodos que se aplican a una vista para cambiar su apariencia o comportamiento, devolviendo una nueva vista.
  5. ¿Qué diferencia hay entre VStackHStack y ZStack? VStack apila vistas verticalmente, HStack horizontalmente, y ZStack unas encima de otras (en profundidad).
  6. ¿Qué hace @State? Declara un estado local en una vista; cuando su valor cambia, SwiftUI re-renderiza la vista automáticamente.
  7. ¿Para qué sirve @Binding? Crea una conexión bidireccional entre una vista que almacena los datos y otra vista que los modifica.
  8. ¿Qué es @ObservedObject? Se suscribe a un objeto externo (ObservableObject) para que la vista se actualice cuando sus datos cambien. No crea el objeto, solo lo observa.
  9. ¿En qué se diferencia @StateObject de @ObservedObject? @StateObject se utiliza para crear e inicializar el objeto observable, asegurando que no se destruya si la vista se recarga.
  10. ¿Qué es @EnvironmentObject? Permite inyectar un objeto observable en la jerarquía de vistas, de modo que cualquier vista hija pueda acceder a él sin pasarlo explícitamente.

Datos y Entorno en SwiftUI

  1. ¿Qué es ObservableObject? Es un protocolo para clases cuyos cambios de estado pueden ser observados por SwiftUI.
  2. ¿Qué hace el wrapper @Published? Se usa dentro de un ObservableObject para emitir notificaciones automáticamente cuando el valor de la propiedad cambia.
  3. ¿Para qué sirve @AppStorage? Es un property wrapper de SwiftUI que lee y escribe valores directamente en UserDefaults.
  4. ¿Qué es @SceneStorage? Almacena datos ligeros vinculados a una escena específica, útil para restaurar el estado en apps con múltiples ventanas o en el iPad.
  5. ¿Qué son los EnvironmentValues? Son variables globales del sistema (como el esquema de color o tamaño de fuente) accesibles mediante el property wrapper @Environment.
  6. ¿Para qué sirve el protocolo Identifiable? Requiere que el tipo tenga una propiedad id única, esencial para iterar colecciones en SwiftUI.
  7. ¿Por qué usamos Hashable en algunas Listas? Si un elemento no es Identifiable, podemos usar \.self en un ForEach, lo cual requiere que el tipo conforme a Hashable.
  8. ¿Qué es un ForEach en SwiftUI? Es una estructura que computa vistas bajo demanda a partir de una colección subyacente de datos identificables.
  9. ¿Cuál es la diferencia entre List y LazyVStack? List proporciona estilos predeterminados de tabla del sistema, mientras que LazyVStack es simplemente una pila vertical de carga perezosa y altamente personalizable.
  10. ¿Cómo haces que el contenido sea desplazable? Envolviéndolo en un ScrollView.

UI Avanzada y Arquitectura Visual

  1. ¿Qué es GeometryReader? Es un contenedor que proporciona información sobre el tamaño y el área de coordenadas de su vista padre.
  2. ¿Qué es un ViewBuilder? Es un closure especial que permite construir múltiples vistas infantiles de manera declarativa.
  3. ¿Para qué sirve PreferenceKey? Permite que las vistas hijas pasen información hacia arriba en la jerarquía a sus vistas padres.
  4. ¿Cuándo usarías la anotación @ViewBuilder? Al crear funciones o propiedades personalizadas que necesitan devolver múltiples vistas o condicionales de vistas.
  5. ¿Qué es matchedGeometryEffect? Es un modificador que sincroniza y anima fluidamente la transición de una vista desde un lugar a otro en la pantalla.
  6. ¿Qué son las transitions (transiciones)? Definen cómo se anima una vista al insertarse o eliminarse de la jerarquía de vistas.
  7. ¿Para qué sirve withAnimation? Es un bloque explícito que le dice a SwiftUI que anime cualquier cambio de estado que ocurra dentro de él.
  8. ¿Qué es el protocolo Animatable? Permite crear animaciones complejas y personalizadas interpolando valores numéricos de una vista.
  9. ¿Cuál es la diferencia entre NavigationView y NavigationStack? NavigationView es el componente clásico (ahora obsoleto), mientras que NavigationStack es la nueva API (iOS 16+) para navegación orientada a datos.
  10. ¿Cómo se crean pestañas en SwiftUI? Utilizando el contenedor TabView.

Concurrencia y Combine

  1. ¿Qué son async y await en Swift? Es el modelo de concurrencia estructurada que permite escribir código asíncrono de forma secuencial y legible.
  2. ¿Qué es un Task? Es una unidad de trabajo asíncrona; permite ejecutar código async desde un contexto sincrónico como una vista de SwiftUI.
  3. ¿Qué hace @MainActor? Asegura que el código de una clase o función se ejecute siempre en el hilo principal (esencial para la UI).
  4. ¿Qué es un actor? Es un tipo de referencia, similar a una clase, que aísla su estado interno para prevenir condiciones de carrera (data races) de forma segura.
  5. ¿Qué es el protocolo Sendable? Indica que un tipo es seguro para ser compartido de manera concurrente entre diferentes hilos.
  6. ¿Qué es el framework Combine? Es la API funcional reactiva de Apple para procesar valores a lo largo del tiempo.
  7. ¿Qué es un AnyCancellable? Es un token que mantiene viva una suscripción de Combine y la cancela automáticamente al ser desasignado de la memoria.
  8. ¿Qué es un PassthroughSubject? Es un publicador de Combine que emite eventos a sus suscriptores pero no almacena ningún estado.
  9. ¿Qué es un CurrentValueSubject? Es un publicador que almacena su valor actual y lo emite inmediatamente a los nuevos suscriptores.
  10. ¿Para qué sirve el método sink? Crea un suscriptor en Combine que ejecuta un closure cada vez que recibe un nuevo valor o una finalización.

Arquitectura y Testing

  1. ¿Qué patrón de arquitectura encaja mejor con SwiftUI? MVVM (Model-View-ViewModel) es el más utilizado, apoyándose en @StateObject y @Published para vincular la lógica.
  2. ¿Qué es Clean Architecture? Es una arquitectura que divide el código en capas (Presentación, Dominio, Datos) para independizar la UI y los frameworks del negocio.
  3. ¿Qué es el patrón Singleton? Es un patrón que garantiza que una clase solo tenga una única instancia global accesible durante el ciclo de vida de la app.
  4. ¿Qué es la inyección de dependencias (DI)? Es pasar los objetos necesarios a una clase en lugar de dejar que la clase los instancie, mejorando la modularidad y el testing.
  5. ¿Qué es XCTest? Es el framework nativo de Xcode para escribir pruebas unitarias y de integración.
  6. ¿Para qué sirve accessibilityIdentifier en UI Testing? Asigna un identificador único a los elementos visuales para que XCUITest pueda encontrarlos e interactuar con ellos fácilmente.
  7. ¿Cómo se prueban las vistas en SwiftUI? Generalmente se prueba la lógica en el ViewModel, pero para la UI directa se usan herramientas como ViewInspector o los UI Tests nativos de Apple.
  8. ¿Qué diferencia hay entre Mocks y Stubs? Los Stubs proveen respuestas preparadas a las llamadas durante los test, mientras que los Mocks verifican que ciertos métodos fueron llamados.
  9. ¿Se usa el patrón Coordinator en SwiftUI? Sí, se suele adaptar (a menudo llamado Router o NavigationCoordinator) para extraer la lógica de navegación fuera de las vistas.
  10. ¿Es compatible Redux con SwiftUI? Sí, arquitecturas unidireccionales como TCA (The Composable Architecture) basadas en principios de Redux son muy populares.

Herramientas, Xcode e iOS

  1. ¿Qué es Xcode? Es el Entorno de Desarrollo Integrado (IDE) oficial de Apple utilizado para crear aplicaciones para sus sistemas operativos.
  2. ¿Qué es Swift Package Manager (SPM)? Es la herramienta oficial integrada de Apple para gestionar dependencias de código fuente.
  3. ¿Cuál es la diferencia entre CocoaPods y SPM? CocoaPods es un gestor de dependencias de terceros basado en Ruby; SPM es nativo, más rápido y está totalmente integrado en Xcode.
  4. ¿Para qué sirven las Xcode Previews? Permiten visualizar y probar la interfaz de SwiftUI en tiempo real sin necesidad de compilar y correr el simulador completo.
  5. ¿Qué es la herramienta Instruments? Es un conjunto de herramientas de perfilado en Xcode para analizar el rendimiento, la memoria y el uso de CPU de la app.
  6. ¿Qué es el Info.plist? Es un archivo de propiedades que contiene metadatos esenciales de la aplicación, como permisos de usuario (cámara, ubicación) y configuraciones base.
  7. ¿Cómo es el ciclo de vida de una app puramente en SwiftUI? Utiliza el atributo @main sobre una estructura que conforma el protocolo App, que a su vez define una o más Scene (como WindowGroup).
  8. ¿Cómo usar un AppDelegate en SwiftUI? Mediante el property wrapper @UIApplicationDelegateAdaptor, el cual permite integrar el ciclo de vida clásico de UIKit.
  9. ¿Qué es UserDefaults? Es una base de datos ligera de clave-valor utilizada para guardar pequeñas preferencias del usuario.
  10. ¿Cómo se integra CoreData en SwiftUI? Principalmente a través del property wrapper @FetchRequest, que se enlaza directamente a la base de datos para actualizar la UI automáticamente.
Visited 1 times, 1 visit(s) today
Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Article

Como volver a la vistar raíz en SwiftUI con NavigationStack

Related Posts