variable print objective objc log imprimir debug consola swift debugging logging console

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



xcode print to console (5)

¡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 .

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

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?


Algunas diferencias

  1. print vs println :

    La función de 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 usa println , ahora puede reemplazarlo de manera 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 sí. 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 lo hará;

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

    • NSLog utiliza cadenas de formato de estilo printf , p. Ej.

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

      eso producirá:

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

  3. A partir de iOS 10 / macOS 10.12, existe una tercera alternativa, os_log , que forma parte del sistema de "registro unificado" (vea el video de WWDC 2016 Registro unificado y rastreo de 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.

    • Ahora puede controlar los campos "subsistema" y "categoría" disponibles en la aplicación 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 en función de ellas. Es muy útil cuando desea diferenciar sus 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 usa la aplicación de consola externa, puede elegir ver solo los 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). Esta configuración también dicta muchos detalles sutiles sobre si las cosas se registran en el disco o no. Vea el video de 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ías que hacer:

      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 de forma predeterminada y los objetos (por ejemplo, cadenas) son privados de forma predeterminada. En el ejemplo anterior en el que registraste la URL, si la aplicación se invocara desde el dispositivo y estuvieras viendo desde la aplicación de consola de tu Mac, verías:

      url = <privado>

      Si quisieras verlo desde un dispositivo externo, deberías hacer lo siguiente:

      os_log("url = %{public}@", url.absoluteString)

    • Tenga en cuenta que NSLog ahora utiliza 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 , la 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 se os_log enormemente al depurar aplicaciones de iOS que deben probarse fuera de Xcode. Por ejemplo, cuando se prueban procesos de aplicaciones iOS en segundo plano, como la búsqueda en segundo plano, estar conectado al depurador Xcode cambia el ciclo de vida de la aplicación . Por lo tanto, con frecuencia querrá 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 os_log su dispositivo iOS desde la aplicación de consola macOS.


Hay otro método llamado dump() que también se puede usar para iniciar sesión:

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

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

De las funciones de la biblioteca estándar de Swift


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

De Apple :

El sistema de registro unificado proporciona una API única, eficiente y eficiente 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 adelante para registrar todo tipo de mensajes, incluidos 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 la inspección conveniente de registros y actividades para los desarrolladores. De hecho, es probable que el nuevo sistema tenga una huella tan baja que no causará el "efecto observador" donde su error desaparece si inserta un comando de registro, lo que interfiere con el momento en que se produce el error.

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

Para resumir: use print() para su depuración personal para mayor comodidad (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.


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

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

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 terminador

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

Separador

Ahora puede usar el separador para concatenar múltiples elementos

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

Ambos

O podrías combinarlo de esta manera

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