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


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

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

Author: Honey, 2014-09-20

5 answers

Algunas diferencias:

  1. print vs println:

    La función print imprime mensajes en la consola 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 un código antiguo que está usando println, ahora puede reemplazarlo de forma segura con print.

    De vuelta en Swift 1.x, print no agregó caracteres de nueva línea al final de la cadena impresa, mientras que println lo hizo. Pero hoy en día, print siempre añade 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 print no lo hará;

    • NSLog las instrucciones aparecen tanto en la consola del dispositivo como en la del depurador, mientras que print solo aparece en la consola del depurador.

    • NSLog usos printf-cadenas de formato de estilo, por ejemplo,

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

      Que producirá: {[43]]}

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

  3. Efectivo iOS 10/macOS 10.12, hay una tercera alternativa, os_log, parte del sistema de "registro unificado" (consulte el video WWDC 2016 Registro unificado y Seguimiento de actividad ).

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

      import os.log
      
    • Like NSLog, os_log también enviará mensajes a la consola de depuración de Xcode y a la consola del dispositivo

    • Ahora puede controlar los campos "subsistema" y "categoría" disponibles en la aplicación de 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 también puede filtrar sobre la base de estas. 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 mensajes de ciertas categorías (por ejemplo, solo mostrar mensajes de depuración si elige "Incluir mensajes de depuración" en el menú "Acción" de la Consola). Estos ajustes también dictan muchos problemas sutiles detalles acerca de si las cosas se registran en el disco o no. Vea el video de WWDC para más detalles.

    • No se puede utilizar la interpolación de cadenas cuando se utiliza os_log. Por ejemplo, no se puede hacer:

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

      Tendrías que hacer:{[43]]}

      os_log("url = %@", url.absoluteString)
      
    • Una de las razones de la limitación anterior es apoyar la privacidad de los datos. Los tipos de datos primitivos (por ejemplo, números) son públicos por defecto y los objetos (por ejemplo, cadenas) son privados por defecto. En el ejemplo anterior donde se registró la URL, si la aplicación se invocó desde el propio dispositivo y que estaban viendo desde la aplicación de la consola de su Mac, usted vería:

      Url =

      Si quisieras verlo desde un dispositivo externo, tendrías que hacer:{[43]]}

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

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

      • No admite configuración de privacidad.

Línea de Fondo, print es suficiente para tareas simples, pero NSLog es útil porque incluye información de marca para usted.

El poder de os_log entra en gran alivio al depurar aplicaciones iOS que deben probarse fuera de Xcode. Por ejemplo, al probar procesos de aplicaciones iOS en segundo plano como background fetch, estar conectado al depurador Xcode cambia el ciclo de vida de la aplicación. Por lo tanto, con frecuencia lo hará desea probar en un dispositivo físico, ejecutando la aplicación desde el propio dispositivo, no iniciando la aplicación desde el depurador de Xcode. El registro unificado le permite seguir viendo las declaraciones de su dispositivo iOS os_log desde la aplicación de consola de macOS.

 594
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 20:16:05

Si estás usando Swift 2, ahora solo puedes usar print() para escribir algo en la salida.

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

Actualizado a iOS 9

Por defecto, la función termina la línea que imprime añadiendo 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 terminator

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

Separador

Ahora puede usar separador para concatenar múltiples elementos

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

Ambos

O puedes combinar usando de esta manera

print("Hello", "Swift", 2, separator:" ", terminator:".")
 70
Author: Jorge Casariego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 13:17:24

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

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

Ejemplos:

  • Cadenas
    • print("Hello World!") se convierte en Hello World
    • debugPrint("Hello World!") se convierte en "Hello World" (¡Comillas!)
  • Rangos
    • print(1..<6) se convierte en 1..<6
    • debugPrint(1..<6) se convierte en Range(1..<6)

Cualquier clase puede personalizar su representación de cadena de depuración vía CustomDebugStringConvertible protocolo.

 57
Author: Valentin Shergin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 06:18:29

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 (incluidos ASL y Syslog, NSLog), y también supera los enfoques de registro existentes en el rendimiento, gracias a sus nuevas técnicas que incluyen la compresión de datos de registro y la recopilación de datos diferida.

De Apple:

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

Apple recomienda encarecidamente usar os_log 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 recopilación de datos centralizada que permite una inspección de registro y actividad conveniente para los desarrolladores. De hecho, es probable que el nuevo sistema tenga una huella tan baja que no haga que el" efecto observador " donde su error desaparece si inserta un comando de registro, interfiriendo en el momento en que ocurra el error.

Rendimiento del Seguimiento de Actividades, ahora parte del nuevo sistema unificado de Registro

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

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

 23
Author: HuaTham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-18 10:24:48

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

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

Vuelca el contenido de un objeto usando su mirror a la salida estándar.

Desde Funciones de la Biblioteca Estándar Swift

 2
Author: JAL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 16:50:02