Swift: print () vs println () vs NSLog ()

¿Cuál es la diferencia entre print , NSLog e println y cuándo debo usar cada uno?

Por ejemplo, en Python, si quería imprimir un diccionario, simplemente print myDict , pero ahora tengo otras 2 opciones. ¿Cómo y cuándo debo usar cada uno?

Algunas diferencias:

  1. print frente a println :

    La función de print imprime mensajes en la consola de Xcode al depurar aplicaciones.

    El println es una variación de esto que se eliminó en Swift 2 y ya no se usa. Si ve el código anterior que está utilizando println , ahora puede reemplazarlo de manera segura con la print .

    De vuelta en Swift 1.x, print no agregó caracteres de nueva línea al final de la cadena impresa, mientras que println hizo. Pero hoy en día, print siempre agrega el carácter de nueva línea al final de la cadena, y si no desea que lo haga, proporcione un parámetro terminator de "" .

  2. NSLog :

    • NSLog es más lento;

    • NSLog agrega una marca de tiempo e identificador a la salida, mientras que la print no;

    • NSLog sentencias NSLog aparecen en la consola del dispositivo y en la consola del depurador, mientras que la print solo aparece en la consola del depurador.

    • NSLog utiliza cadenas de formato de estilo de NSLog , por ejemplo

       NSLog("%0.4f", CGFloat.pi) 

      eso producirá:

      2017-06-09 11: 57: 55.642328-0700 MyApp [28937: 1751492] 3.1416

  3. Efectivo iOS 10 / macOS 10.12, existe una tercera alternativa, os_log , que forma parte del sistema de “registro unificado” (ver el registro unificado de la WWDC 2016 y el seguimiento de la actividad ).

    • Debe importar os.log antes de usar la función os_log :

       import os.log 
    • Al igual que NSLog , os_log enviará mensajes tanto a la consola de depuración de Xcode como a la consola del dispositivo, también

    • Ahora puede controlar los campos “subsistema” y “categoría” disponibles en la aplicación de la Consola. Por ejemplo:

       let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network") os_log("url = %@", log: log, url.absoluteString) 

      Cuando observa la aplicación a través de la aplicación de consola externa, no solo puede agregar estas columnas a la vista principal, sino que puede filtrar en función de ellas. Es muy útil cuando se quiere diferenciar los mensajes de depuración de (a) los generados por otros subsistemas en nombre de su aplicación; o (b) mensajes de otras categorías o tipos.

    • Puede especificar diferentes tipos de mensajes de registro, ya sea .info , .debug , .error , .fault (o .default ):

       os_log("web service did not respond", type: .error) 

      Por lo tanto, si utiliza la aplicación de consola externa, puede elegir ver solo los mensajes de ciertas categorías (por ejemplo, solo muestre los mensajes de depuración si elige “Incluir mensajes de depuración” en el menú “Acción” de la consola). Estas configuraciones también dictan muchos detalles sutiles acerca de si las cosas están registradas en el disco o no. Vea el video WWDC para más detalles.

    • No puede usar la interpolación de cadenas cuando usa os_log . Por ejemplo, no puedes hacer:

       os_log("foo \(url.absoluteString)") 

      Tendría que hacer:

       os_log("url = %@", url.absoluteString) 
    • Una de las razones de la limitación anterior es la privacidad de los datos. Los tipos de datos primitivos (por ejemplo, los números) son públicos por defecto y los objetos (por ejemplo, cadenas) son privados por defecto. En el ejemplo anterior en el que registraba la URL, si la aplicación se invocaba desde el dispositivo y usted miraba desde la aplicación Console de su Mac, vería lo siguiente:

      url =

      Si quisieras verlo desde un dispositivo externo, tendrías que hacer:

       os_log("url = %{public}@", url.absoluteString) 
    • Tenga en cuenta que NSLog ahora usa el sistema de notificación unificado detrás de escena, pero con las siguientes advertencias:

      • No puede controlar el subsistema o categoría o tipo de registro;

      • No es compatible con la configuración de privacidad.

En NSLog , print es suficiente para tareas simples, pero NSLog es útil porque incluye información de marca de tiempo para usted.

El poder de os_log entra en relieve cuando se os_log aplicaciones de iOS que deben probarse fuera de Xcode. Por ejemplo, cuando se prueban procesos en la aplicación de fondo de iOS como la obtención de fondos, al estar conectado al depurador de Xcode se cambia el ciclo de vida de la aplicación . Por lo tanto, con frecuencia querrá probar en un dispositivo físico, ejecutar la aplicación desde el dispositivo, no iniciar la aplicación desde el depurador de Xcode. El registro unificado le permite seguir viendo las declaraciones os_log su dispositivo iOS desde la aplicación macOS Console.

Si está utilizando Swift 2 , ahora solo puede usar print () para escribir algo en la salida.

Apple ha combinado las funciones println () e print () en una sola.

Actualizado a iOS 9

Por defecto, la función termina la línea que imprime agregando un salto de línea.

 print("Hello Swift") 

Terminator

Para imprimir un valor sin un salto de línea después de él, pase una cadena vacía como el terminador

 print("Hello Swift", terminator: "") 

Separador

Ahora puede usar el separador para concatenar varios elementos

 print("Hello", "Swift", 2, separator:" ") 

Ambos

O podrías combinar usar de esta manera

 print("Hello", "Swift", 2, separator:" ", terminator:".") 

¡Además, Swift 2 tiene debugPrint() (y el protocolo CustomDebugStringConvertible )!

No se olvide de debugPrint() que funciona como print() pero más adecuado para la depuración .

Ejemplos:

  • Instrumentos de cuerda
    • print("Hello World!") convierte en Hello World
    • debugPrint("Hello World!") convierte en "Hello World" (¡Citas!)
  • Rangos
    • print(1..<6) convierte en 1..<6
    • debugPrint(1..<6) convierte en Range(1..<6)

Cualquier clase puede personalizar su representación de cadena de depuración a través del protocolo CustomDebugStringConvertible .

Para agregar a la respuesta de Rob, desde iOS 10.0, Apple ha introducido un sistema completamente nuevo de “registro unificado” que reemplaza los sistemas de registro existentes (incluyendo ASL y Syslog, NSLog) y también supera los enfoques de registro existentes en rendimiento, gracias a sus nuevas técnicas incluyendo compresión de datos de registro y recostackción de datos diferidos.

De Apple :

El sistema de registro unificado proporciona una única API eficiente y eficaz para capturar mensajes en todos los niveles del sistema. Este sistema unificado centraliza el almacenamiento de datos de registro en la memoria y en un almacén de datos en el disco.

Apple recomienda encarecidamente usar os_log en el futuro para registrar todo tipo de mensajes, incluyendo información, depuración, mensajes de error debido a su rendimiento mucho mejor en comparación con los sistemas de registro anteriores, y su recostackción de datos centralizada que permite la inspección conveniente de registro y actividad para los desarrolladores. De hecho, es probable que el nuevo sistema tenga una huella tan baja que no cause el “efecto de observador” donde su error desaparece si inserta un comando de registro, lo que interfiere con el momento en que ocurre el error.

Desempeño de Activity Tracing, ahora parte del nuevo sistema Unified Logging

Puede obtener más información sobre esto en detalle aquí .

Para resumir: use print() para su depuración personal por conveniencia (pero el mensaje no se registrará cuando se implemente en dispositivos de usuario). Luego, use el registro unificado ( os_log ) tanto como sea posible para todo lo demás.

Hay otro método llamado dump() que también se puede usar para el registro:

 func dump(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int) 

Vuelca los contenidos de un objeto usando su espejo a la salida estándar.

De las funciones de la biblioteca estándar de Swift