¿Cuál es la diferencia entre print
, NSLog
y println
y cuándo debo utilizar cada uno?
Por ejemplo, en Python si quisiera imprimir un diccionario, lo haría print myDict
, pero ahora tengo otras 2 opciones. ¿Cómo y cuándo debo usar cada uno?
Algunas diferencias
print
vs println
:
La print
función imprime mensajes en la consola Xcode al depurar aplicaciones.
Esta 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 con seguridad print
.
De vuelta en Swift 1.x, print
no agregó caracteres de nueva línea al final de la cadena impresa, mientras que lo 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 terminator
parámetro de ""
.
NSLog
:
NSLog
es más lento
NSLog
agrega una marca de tiempo e identificador a la salida, mientras print
que no lo hará;
NSLog
las declaraciones aparecen tanto en la consola del dispositivo como en la consola del depurador, mientras que print
solo aparecen en la consola del depurador.
NSLog
utiliza printf
cadenas de formato de estilo, por ejemplo
NSLog("%0.4f", CGFloat.pi)
eso producirá:
2017-06-09 11: 57: 55.642328-0700 MyApp [28937: 1751492] 3.1416
A partir de iOS 10 / macOS 10.12, existe una tercera alternativa, os_log
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 os_log
función:
import os.log
Al igual que NSLog
, también 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 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, o bien .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 se puede usar la interpolación de cadenas cuando se 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 mismo 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 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 pocas palabras, print
es suficiente para tareas simples, pero NSLog
es útil porque incluye información de marca de tiempo para usted.
El poder de se os_log
pone de relieve cuando se depuran las 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 os_log
declaraciones de su dispositivo iOS desde la aplicación de consola macOS.
print
, aparece en el área de depuración de Xcode, al igual que debugPrint
. La única diferencia es que print
termina llamando al description
método del objeto y a las debugPrint
llamadas debugDescription
, que pueden ser más detalladas que description
.
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:".")
appendNewline
tiene un valor predeterminado detrue
terminator : ""
, por ejemploprint("...", terminator: "")
debugPrint()
(y CustomDebugStringConvertible
protocolo)!No se olvide de debugPrint()
cuál funciona print()
pero es más adecuado para la depuración .
Ejemplos:
print("Hello World!")
se convierte Hello World
debugPrint("Hello World!")
se convierte "Hello World"
(¡Citas!)print(1..<6)
se convierte 1..<6
debugPrint(1..<6)
se convierte Range(1..<6)
Cualquier clase puede personalizar su representación de cadena de depuración a través del CustomDebugStringConvertible
protocolo.
description
es debugDescription
como Python str
es repr
?
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 utilizar os_log
en adelante para registrar todo tipo de mensajes, incluidos mensajes de información, depuración y 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 de observador" donde su error desaparece si inserta un comando de registro, lo que interfiere con el tiempo del error.
Puede obtener más información sobre esto en detalles aquí .
Para resumir: utilícelo print()
para su depuración personal por conveniencia (pero el mensaje no se registrará cuando se implemente en los dispositivos de los usuarios). 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 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.
os_log
. Por favor vea mi respuesta a continuación .os_log
: intente ver la documentación completa de la página del objetivo-C. Es mucho más completo .