Por qué el Code Review en Swift no es cuestión de ser quisquilloso
\nImagina esta situación: abres el pull request de un colega, ves 500 líneas de código Swift y te das cuenta de que en 20 minutos comienza la daily. ¿Te suena familiar? El code review (o revisión de código) no es una competencia de "quién encuentra más errores tipográficos". Es tu oportunidad de prevenir bugs en producción, mejorar la arquitectura y transmitir conocimientos al equipo.
\nEn este artículo he recopilado una lista de verificación de code review para Swift que yo mismo utilizo. Sin rodeos: solo comprobaciones concretas, ejemplos de código y explicaciones de por qué son importantes. Incluso si programas en Python pero te asomas al mundo del desarrollo iOS, el material te será útil.
\n\n1. Seguridad de memoria y tipos opcionales
\nSwift se enorgullece de su seguridad de memoria, pero eso no significa que puedas relajarte. El problema más común es el force unwrapping. Cada signo de exclamación es un posible fallo.
\n\nQué revisar:
\n- \n
- Force unwrap (
!) — solo es aceptable en pruebas o cuando estás 100% seguro del valor. En código de producción, es una bandera roja. \n - IUO (Implicitly Unwrapped Optionals) — úsalos solo para IBOutlet o propiedades que se inicializan después de
init, pero antes del primer uso. \n - Ciclos de retención (retain cycles) — verifica los closures en busca de
[weak self]o[unowned self]. \n
// Mal: force unwrap sin verificación\nlet url = URL(string: "https://pythonlib.ru")! // Fallo si la cadena no es válida\n\n// Bien: guard let\nguard let url = URL(string: "https://pythonlib.ru") else {\n print("URL no válida")\n return\n}\n\n// Verificación de ciclo de retención en closure\nclass NetworkManager {\n var completionHandler: (() -> Void)?\n \n func fetchData() {\n completionHandler = { [weak self] in\n guard let self = self else { return }\n self.updateUI() // self ahora es una referencia débil\n }\n }\n \n func updateUI() { /* ... */ }\n}\n\n\nConsejo para code review: si ves !, pregunta "¿por qué no hay un guard o if let aquí?". Esto evitará muchas caídas.
2. Manejo de errores: no te tragues las excepciones
\nSwift ofrece un potente mecanismo do-catch, pero los desarrolladores a menudo lo ignoran. Un antipatrón típico es try! o un catch vacío.
Qué revisar:
\n- \n
try!— casi siempre es malo. Solo si estás escribiendo una prueba. \n catch {}vacío — simplemente estás perdiendo información sobre el error. Como mínimo, regístralo. \n - Propagación de errores hacia arriba (
throws) — la función debe manejar el error o propagarlo explícitamente. \n
// Mal: nos tragamos el error\ndo {\n let data = try fetchData()\n} catch {\n // No hacemos nada — el error se pierde\n}\n\n// Bien: registramos y mostramos al usuario\ndo {\n let data = try fetchData()\n updateUI(with: data)\n} catch let error as NetworkError {\n showAlert(message: error.localizedDescription)\n} catch {\n print("Error desconocido: \\(error.localizedDescription)")\n showGenericError()\n}\n\n\nEn el code review para Swift, verifica siempre que Error no se ignore simplemente. El usuario debe entender qué salió mal.
3. Arquitectura: ¿MVC, MVVM o VIPER?
\nNo importa qué patrón hayas elegido, lo importante es que el código lo siga. En el code review ves si el ViewController se ha convertido en un "God Object" (una clase que lo hace todo).
\n\nQué revisar:
\n- \n
- Tamaño del archivo — si un archivo tiene más de 300-400 líneas, es motivo para pensar en dividirlo. \n
- Responsabilidad de las clases — el ViewController no debe hacer llamadas de red ni analizar JSON. Para eso están los servicios y los gestores. \n
Blogs
Book Recommendations
Leer también
Metaprogramación en TypeScript: cómo escribir código que escribe código
WebAssembly y TypeScript: guía práctica para desarrolladores web
Bcrypt en PHP: cómo hashear contraseñas rápido y sin errores
Trabajo con el sistema de archivos en PHP: guía completa para principiantes
Estructuras de salida en Go: de principiante a experto en 10 minutos