Saltar al contenido

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

Mantén la atención ya que en este tutorial encontrarás el hallazgo que buscas.Este tutorial fue analizado por nuestros expertos para asegurar la calidad y exactitud de nuestro contenido.

Solución:

Algunas diferencias:

  1. print vs println:

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

    los 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 manera segura con print.

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

  2. NSLog:

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

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

    • NSLog en iOS 10-13 / macOS 10.12-10.x utiliza printfcadenas de formato de estilo, p. ej.

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

      que producirá:

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

    • NSLog desde iOS 14 / macOS 11 puede usar string interpolación. (Entonces, nuevamente, en iOS 14 y macOS 11, generalmente preferiríamos Logger sobre NSLog. Vea el siguiente punto.)

    Hoy en día, mientras NSLog aún funciona, generalmente usaríamos “registro unificado” (ver más abajo) en lugar de NSLog.

  3. Efectivo iOS 14 / macOS 11, tenemos Logger interfaz con el sistema de “registro unificado”. Para una introducción a Logger, consulte WWDC 2020 Explore el registro en Swift.

    • Usar Logger, debes importar os:

      import os
      
    • Igual que NSLog, el registro unificado generará mensajes tanto en la consola de depuración de Xcode como en la consola del dispositivo.

    • Crear un Logger y log un mensaje para él:

      let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "network")
      logger.log("url = (url)")
      

      Cuando observa la aplicación a través de la aplicación de consola externa, puede filtrar en función de la subsystem y category. Es muy útil diferenciar sus mensajes de depuración de (a) aquellos 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, .critical, .notice, .trace, etc .:

      logger.error("web service did not respond (error.localizedDescription)")
      

      Por lo tanto, si usa la aplicación de consola externa, puede elegir ver solo los mensajes de ciertas categorías (por ejemplo, mostrar solo 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 de problemas sutiles sobre si las cosas se registran en el disco o no. Vea el video de la WWDC para obtener más detalles.

    • De forma predeterminada, los datos no numéricos se redactan en los registros. En el ejemplo en el que registró la URL, si la aplicación se invocara desde el dispositivo y estuviera mirando desde la aplicación de la Consola macOS, vería lo siguiente en la Consola macOS:

      url =

      Si está seguro de que este mensaje no incluirá datos confidenciales del usuario y desea ver las cadenas en su consola macOS, tendrá que hacer lo siguiente:

      os_log("url = (url, privacy: .public)")
      
  4. Antes de iOS 14 / macOS 11, se introdujo iOS 10 / macOS 10.12 os_log para la “tala unificada”. Para obtener una introducción al registro unificado en general, consulte el video Registro unificado y seguimiento de actividad de la WWDC 2016.

    • Importar os.log:

      import os.log
      
    • Deberías definir el subsystem y category:

      let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network")
      

      Cuando usas os_log, utilizaría un patrón de estilo printf en lugar de string interpolación:

      os_log("url = %@", log: log, url.absoluteString)
      
    • 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)
      
    • No se puede utilizar string interpolación al usar os_log. Por ejemplo con print y Logger tú haces:

      logger.log("url = (url)")
      

      Pero con os_log, tendrías que hacer:

      os_log("url = %@", url.absoluteString)
      
    • los os_log impone la misma privacidad de datos, pero usted especifica la visibilidad pública en el formateador printf (p. ej. %public@ en vez de %@). Por ejemplo, si quisiera verlo desde un dispositivo externo, tendría que hacer:

      os_log("url = %public@", url.absoluteString)
      
    • También puede usar el registro de “Puntos de interés” si desea ver rangos de actividades de Instruments:

      let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
      

      Y comience un rango con:

      os_signpost(.begin, log: pointsOfInterest, name: "Network request")
      

      Y terminarlo con:

      os_signpost(.end, log: pointsOfInterest, name: "Network request")
      

      Para obtener más información, consulte https://stackoverflow.com/a/39416673/1271826.

Línea de fondo, print es suficiente para un registro simple con Xcode, pero un registro unificado (ya sea Logger o os_log) logra lo mismo pero ofrece capacidades mucho mayores.

El poder del registro unificado se pone de manifiesto al depurar aplicaciones de iOS que deben probarse fuera de Xcode. Por ejemplo, cuando se prueban procesos de aplicaciones de iOS en segundo plano, como la búsqueda en segundo plano, estar conectado al depurador de 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 de registro de su dispositivo iOS desde la aplicación de consola macOS.

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

Apple ha combinado ambos println () y impresión() funciones en uno.

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 un vacío string como el terminador

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

Separador

Ahora puede usar el separador para concatenar varios elementos

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

Ambos

O puede combinar el uso de esta manera

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

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

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

Ejemplos:

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

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

Reseñas y valoraciones

Recuerda recomendar este artículo si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *