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?
5 answers
Algunas diferencias:
-
print
vsprintln
: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á usandoprintln
, ahora puede reemplazarlo de forma segura conprint
.De vuelta en Swift 1.x,
print
no agregó caracteres de nueva línea al final de la cadena impresa, mientras queprintln
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ámetroterminator
de""
. -
NSLog
:NSLog
es más lento;-
NSLog
agrega una marca de tiempo e identificador a la salida, mientras queprint
no lo hará; NSLog
las instrucciones aparecen tanto en la consola del dispositivo como en la del depurador, mientras queprint
solo aparece en la consola del depurador.-
NSLog
usosprintf
-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
-
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ónos_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.
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:".")
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 enHello World
-
debugPrint("Hello World!")
se convierte en"Hello World"
(¡Comillas!)
-
-
Rangos
-
print(1..<6)
se convierte en1..<6
-
debugPrint(1..<6)
se convierte enRange(1..<6)
-
Cualquier clase puede personalizar su representación de cadena de depuración vía CustomDebugStringConvertible
protocolo.
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.
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.
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.
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