Introducción: Por qué Swift es la clave para una entrevista exitosa
La entrevista de Swift no es solo una verificación de sintaxis. El ecosistema de Apple requiere comprensión de los principios fundamentales del lenguaje, la gestión de memoria y los frameworks modernos. En este artículo, analizaremos las mejores preguntas que sin duda te harán en cualquier nivel, desde Junior hasta Senior. No solo aprenderás las respuestas correctas, sino también las trampas típicas en las que caen los candidatos.
El artículo está escrito para el portal educativo PythonLib, pero adaptado para Swift. Hemos estructurado el material para que puedas repasar rápidamente los temas clave antes de la entrevista.
1. Fundamentos de Swift: Optional, Value vs Reference Types
¿Qué es Optional y para qué sirve?
Optional es una enumeración (enum) que puede ser .none (nil) o .some(Wrapped). Es la forma en que Swift maneja de forma segura la ausencia de un valor.
var name: String? = "Alice"var age: Int? = nil
// Extracción seguraif let unwrappedName = name { print("Hello, \\(unwrappedName)")} else { print("Name is nil")}Error típico: Usar force unwrap (!) sin verificación. Siempre prefiere guard let o if let.
Value Types vs Reference Types
Swift separa estrictamente los tipos:
- Value Types (estructuras, enumeraciones, tipos básicos) — se copian al asignarse.
- Reference Types (clases) — se pasan por referencia.
struct Point { var x: Int var y: Int}
class Car { var model: String init(model: String) { self.model = model }}
var point1 = Point(x: 1, y: 2)var point2 = point1point2.x = 5 // point1.x seguirá siendo 1
var car1 = Car(model: "Tesla")var car2 = car1car2.model = "BMW" // car1.model también se convertirá en "BMW"Pregunta de entrevista: "¿Por qué Apple recomienda usar estructuras en lugar de clases?" Respuesta: seguridad en hilos, previsibilidad, ausencia de sobrecarga de ARC.
2. Memory Management y ARC: Cómo evitar fugas
¿Cómo funciona Automatic Reference Counting (ARC)?
ARC cuenta automáticamente las referencias a objetos de clase. Cuando el contador llega a cero, la memoria se libera. Los problemas surgen con referencias cíclicas.
class Person { let name: String var apartment: Apartment? init(name: String) { self.name = name } deinit { print("\\(name) deallocated") }}
class Apartment { let unit: String weak var tenant: Person? // weak — referencia débil init(unit: String) { self.unit = unit } deinit { print("Apartment \\(unit) deallocated") }}
var john: Person? = Person(name: "John")var unit4A: Apartment? = Apartment(unit: "4A")john?.apartment = unit4Aunit4A?.tenant = johnjohn = nilunit4A = nil// Ambos objetos serán liberadosModificadores clave:
weak— siempre optional, se vuelve nil automáticamente al liberarse.unowned— no optional, asume que el objeto está vivo (riesgo de crash).
Pregunta típica: "¿Cuál es la diferencia entre weak y unowned?" Respuesta: weak es más seguro, unowned es más conveniente para dependencias obligatorias (por ejemplo, delegado).
3. Frameworks: UIKit vs SwiftUI, GCD y Protocols
UIKit: Ciclo de vida del ViewController y Patrón Delegate
Comprender viewDidLoad, viewWillAppear, viewDidDisappear es básico. Pero en las entrevistas a menudo preguntan sobre el patrón Delegate:
protocol MyDelegate: AnyObject { func didTapButton()}
class MyView: UIView { weak var delegate: MyDelegate? @objc func buttonTapped() { delegate?.didTapButton() }}
class MyViewControlle