Utilizar el clásico print(“funciona”) para detectar que algo se está comportando como deseamos es una de las prácticas más comunes entre desarrolladores, no sólo en Swift; y no lo tomen a mal, de hecho es una de las formas más sencillas para leer el valor de una variable en tiempo de ejecución, verificar la llamada de una función, etc; sin embargo, no significa que sea la mejor forma de hacerlo.

XCode nos proporciona una gama de herramientas para poder debuggear nuestro código de una forma óptima y rápida, lo cuál nos dará un beneficio mayor a la hora de verificar que nuestro código funcione sin errores y para comprobar el funcionamiento de la lógica deseada en toda la aplicación.


Breakpoints

Muy seguramente habrás notado que en la parte izquierda del código, al dar click, se colocan una especie de marcadores, dichos marcadores se llaman breakpoints y éstos señalan la línea de código en la que la ejecución de la aplicación se pausará.

Breakpoint habilitado

Los breakpoints se pueden deshabilitar al dar click sobre los mismos y volver a habilitar si así se desea.


Muy bien, y ¿cómo se supone que me deshago de los prints?

Para empezar a debuggear utilizando los breakpoints, primero debemos entender cómo funcionan en el proceso de ejecución de la aplicación, es muy sencillo.

Como mencioné anteriormente, un breakpoint pausará la ejecución de la aplicación en la línea de código que apunta. Si en dicha línea ocurre un crash, la aplicación terminará su ejecución, como lo haría normalmente, ignorando el breakpoint. Cuando la aplicación se pausa debido a un breakpoint se mostrará la línea de código en verde, a diferencia del color rojo que se muestra cuando ocurre un crash.

Línea de código en verde, señalando la pausa del breakpoint

Ahora bien, mientras la aplicación está pausada, se pueden agregar más breakpoints, y si se reanuda la ejecución y encuentra un breakpoint posterior, se pausará. Se pueden agregar tantos breakpoints como se desée, deshabilitar y eliminar.

Para no perder la pista de todos los breakpoints que hemos creado existe el Breakpoint Navigator, en el cuál podremos visualizar todos los breakpoints que viven en nuestro proyecto.

Breakpoint Navigator

Ya agregué 100 breakpoints, mi app está pausada, ¿En qué momento observo la magia?

Aquí es precisamente donde la magia comienza. Seguramente habrás notado la consola, el lugar donde tus prints vivían, tu pan de cada día a la hora de debuggear tu código, bueno, no tendrás que extrañarla ya que ¡seguirás utilizándola! Pero ahora de una manera más profesional.

En la consola existen diversos comandos que puedes ejecutar mientras la aplicación está pausada, sí, como en cualquier otra terminal, dos de ellos son po y p; que significan print out y print respectivamente. Sí, así como lo lées, son prints! “Pero qué clase de tonterías dices, ¿Acaso no me desharía de ellos?” te preguntarás, bueno, yo dije que te desharías del print() específicamente, no de los prints :v) Pero calma, éstos prints son mucho mejores y te darán mucha más información de la que alguna vez imaginaste.

Cuando la aplicación está pausada, al escribir po seguido de una variable, notarás que la autocompleta.

Autocompletado de variable en consola

Así es, ¡puedes seguir imprimiendo tus variables!, la diferencia es que ahora no tendrás que llenar de print() todo tu código, simplemente imprimirás la variable que desées cuando lo desées, y la mejor parte es que te muestra exactamente lo mismo que te mostraría un print() normal.

Print utilizando po de una variable en consola

Pero espera, que la magia de los prints no termina ahí, existe el comando p, que como mencioné anteriormente es un print también, pero ¿qué diferencia tiene?, mucha, ya que éste comando no sólo te imprime el contenido de la variable, sino toda su estructura, de una manera humanamente legible.

Print utilizando p de UICollectionView en consola

Podrás notar que imprime todos los objetos de los cuáles proviene, en orden ascendente, UIScrollView < UIView < UIResponder < NSObject, así como todas las propiedades de dicho IBOutlet.

¿Sorprendido?

Existe otra forma más sencilla de poder visualizar el valor de una variable y es simplemente posicionar el cursor encima de la variable, en el código, y colapsar la información que se muestra.

Información de la variable en tiempo de ejecución

Como podrás haber notado, el uso de éstas técnicas hace el debugging más dinámico, sencillo y profesional, dándote más herramientas y beneficios a la hora de controlar la calidad de tu aplicación y eliminando la adición de más líneas de código utilizando prints complejos y molestos que siempre van a estar visualizándose en consola, obstruyendo así la información que realmente te interesa.

¡Hasta la próxima!

Uuh, ¿Qué dices? ¿Extrañas los prints? No te deprimas, puedes seguir usándolos a la par de éstas técnicas de debugging, sin embargo, si lo vas a hacer, te mostraré una utilidad más en dichos print() que tanto amas.

print("(#file):(#line), (#function) --- HELLO WORLD!")

De ésta forma, automáticamente estarás imprimiendo la ruta del archivo, la línea de código y la función en la que se está ejecutando éste HELLO WORLD, así es, no más búsquedas tardadas del archivo que quieres modificar en los 100 archivos y 100 folders que conforman tu proyecto.

/Users/adamjensen/Documents/Git/Proyecto/Modules/HomeMenu/HomeMenuView.swift:134, show_data_store(_:) --- HELLO WORLD!

Así puedo observar que la línea que imprime el HELLO WORLD está viviendo en mi archivo HomeMenuView, en la línea 134, dentro de la función show_data_store().


Obviamente no se han abarcado TODOS los comandos de la terminal, TODAS las opciones de los breakpoints y TODAS las funcionalidades extra en los print() anteriores, sin embargo, ahora tienes una idea mucho más grande de las capacidades de debugging en XCode y ésto seguramente alimentará tu curiosidad por saber más y convertirte en un mejor desarrollador.

Happy coding.