Swift: print() vs println() vs NSLog() — ¿qué elegir y por qué es importante?
\n\nCualquiera que empiece a aprender Swift, tarde o temprano se encuentra con la salida de datos a la consola. Parece algo sencillo, ¿verdad? Pero aquí surge la confusión: print(), println() y NSLog() — ¿cuál es la diferencia? ¿Por qué se necesitan tres formas si se podría dejar solo una? En este artículo lo desglosaremos todo, lo mostraremos con ejemplos y te ayudaremos a no confundir nunca más estas funciones.
El tema se basa en una pregunta popular real de Stack Overflow que ha acumulado miles de visitas. Lo hemos adaptado para contenido educativo, para que puedas no solo memorizar, sino entender la lógica de Swift.
\n\n\n\n
Breve historia: de Objective-C al Swift moderno
\n\nPara entender la diferencia, hay que sumergirse un poco en la historia. Swift es un lenguaje joven (lanzado en 2014), pero fue creado como sucesor de Objective-C. Por lo tanto, conviven tanto funciones "nativas" de Swift como las antiguas provenientes del mundo Apple.
\n\n- \n
println()— un vestigio de las primeras versiones de Swift (anteriores a la versión 2.0). Hoy está completamente eliminado. \n print()— el reemplazo moderno deprintln(), apareció en Swift 2.0. \n NSLog()— una función del mundo de Objective-C que todavía se usa activamente para depuración. \n
Si escribes en Swift moderno (versión 4.x y superiores), ya no te encontrarás con println() — el compilador simplemente dará un error. Pero en tutoriales antiguos y foros todavía aparece, por lo que es importante entender qué es y con qué se reemplazó.
\n\n
print() — la herramienta principal para la salida
\n\n¿Cómo funciona print()?
\n\nA partir de Swift 2.0, print() se convirtió en la forma estándar de enviar datos a la consola. Es flexible, simple y completamente controlable.
let name = "Ana"\nlet age = 25\n\nprint("¡Hola, \\(name)! Tienes \\(age) años.")\n// Salida: ¡Hola, Ana! Tienes 25 años.\n\nLa principal diferencia con el antiguo println() es que print() no añade un carácter de nueva línea automáticamente. Bueno, sí lo añade, pero puedes controlarlo con el parámetro terminator.
// Salida normal\nprint("Primera línea")\nprint("Segunda línea")\n// Salida:\n// Primera línea\n// Segunda línea\n\n// Salida sin salto de línea\nprint("Primera línea", terminator: "")\nprint("Segunda línea", terminator: "")\n// Salida: Primera líneaSegunda línea\n\nParámetros de print()
\n\n- \n
items— lo que se imprime (pueden ser varios valores separados por comas). \n separator— separador entre elementos (por defecto un espacio). \n terminator— qué poner al final de la línea (por defecto\\n— salto de línea). \n
print(1, 2, 3, separator: "-", terminator: "!")\n// Salida: 1-2-3!\n\nCuándo usarlo: para salida de datos normal, registro en aplicaciones simples, ejemplos educativos.
\n\n\n\n
println() — un visitante del pasado
\n\nSi te encuentras con println() en algún código antiguo, debes saber que es el equivalente de print() de las primeras versiones de Swift. La única diferencia: println() siempre añadía un carácter de nueva línea al final, y no tenía el parámetro terminator.
// Código antiguo en Swift 1.x\nlet x = 10\nprintln("El valor de x = \\(x)")\n// Salida: El valor de x = 10 (con salto de línea)\n\nEn las versiones modernas de Swift (a partir de la 2.0) println() ya no existe. Si intentas usarlo, obtendrás un error de compilación. Simplemente reemplázalo por print() y todo funcionará.