Quelle est la différence entre print
, NSLog
et println
quand dois - je utiliser chacun?
Par exemple, en Python, si je voulais imprimer un dictionnaire, je le ferais print myDict
, mais maintenant j'ai 2 autres options. Comment et quand dois-je les utiliser?
os_log
. Veuillez voir ma réponse ci-dessous .os_log
: essayez de voir la documentation complète de la page objective-C. C'est beaucoup plus complet .Réponses:
Quelques différences:
print
vsprintln
:La
print
fonction imprime des messages dans la console Xcode lors du débogage des applications.C'est
println
une variante de cela qui a été supprimée dans Swift 2 et qui n'est plus utilisée. Si vous voyez l'ancien code utiliséprintln
, vous pouvez maintenant le remplacer en toute sécurité parprint
.De retour dans Swift 1.x,
print
n'a pas ajouté de caractères de nouvelle ligne à la fin de la chaîne imprimée, alors queprintln
oui. Mais de nos jours,print
ajoute toujours le caractère de nouvelle ligne à la fin de la chaîne, et si vous ne le souhaitez pas, fournissez unterminator
paramètre de""
.NSLog
:NSLog
est plus lent;NSLog
ajoute un horodatage et un identifiant à la sortie, alors queprint
non;NSLog
Les instructions apparaissent à la fois dans la console du périphérique et dans la console du débogueur, alorsprint
qu'elles n'apparaissent que dans la console du débogueur.NSLog
utiliseprintf
des chaînes de format -style, par exemplequi produira:
À partir d'iOS 10 / macOS 10.12, il existe une troisième alternative,
os_log
faisant partie du système de «journalisation unifiée» (voir la vidéo de la WWDC 2016 Journalisation unifiée et suivi des activités ).Vous devez importer
os.log
avant d'utiliser laos_log
fonction:Comme
NSLog
,os_log
affichera des messages à la fois sur la console de débogage Xcode et la console de l'appareilVous pouvez désormais contrôler les champs "sous-système" et "catégorie" disponibles dans l'application Console. Par exemple:
Lorsque vous observez l'application via l'application console externe, vous pouvez non seulement ajouter ces colonnes à la vue principale, mais vous pouvez filtrer en fonction de celles-ci. C'est très utile lorsque vous souhaitez différencier vos messages de débogage de (a) ceux générés par d'autres sous-systèmes au nom de votre application; ou (b) des messages d'autres catégories ou types.
Vous pouvez spécifier différents types de journalisation des messages, que ce soit
.info
,.debug
,.error
,.fault
(ou.default
):Ainsi, si vous utilisez l'application console externe, vous pouvez choisir de ne voir que les messages de certaines catégories (par exemple, afficher uniquement les messages de débogage si vous choisissez "Inclure les messages de débogage" dans le menu "Action" de la console). Ces paramètres dictent également de nombreux détails subtils sur la question de savoir si les choses sont enregistrées sur disque ou non. Voir la vidéo WWDC pour plus de détails.
Vous ne pouvez pas utiliser d'interpolation de chaîne lors de l'utilisation
os_log
. Par exemple, vous ne pouvez pas faire:Vous auriez à faire:
L'une des raisons de la limitation ci-dessus est de prendre en charge la confidentialité des données. Les types de données primitifs (par exemple les nombres) sont publics par défaut et les objets (par exemple les chaînes) sont privés par défaut. Dans l'exemple précédent où vous avez enregistré l'URL, si l'application était invoquée depuis l'appareil lui-même et que vous regardiez depuis l'application de la console de votre Mac, vous verriez:
Si vous vouliez le voir depuis un périphérique externe, vous auriez à faire:
Remarque,
NSLog
utilise désormais le système de notification unifié en arrière-plan, mais avec les mises en garde suivantes:Vous ne pouvez pas contrôler le sous-système ou la catégorie ou le type de journal;
Il ne prend pas en charge les paramètres de confidentialité.
En bout de ligne,
print
est suffisant pour les tâches simples, maisNSLog
est utile car il comprend des informations d'horodatage pour vous.La puissance de
os_log
vient en relief lors du débogage des applications iOS qui doivent être testées en dehors de Xcode. Par exemple, lors du test de processus d'application iOS en arrière-plan, comme la récupération en arrière-plan, la connexion au débogueur Xcode modifie le cycle de vie de l'application . Ainsi, vous souhaiterez fréquemment tester sur un appareil physique, en exécutant l'application à partir de l'appareil lui-même, sans démarrer l'application à partir du débogueur de Xcode. La journalisation unifiée vous permet de toujours regarder lesos_log
relevés de votre appareil iOS à partir de l'application console macOS.la source
print
, il apparaît dans la zone de débogage de Xcode, tout commedebugPrint
. La seule différence est que celaprint
finit par appeler ladescription
méthode de l'objet et lesdebugPrint
appelsdebugDescription
, qui peuvent être plus verbeux quedescription
.Si vous utilisez Swift 2 , vous ne pouvez désormais utiliser que print () pour écrire quelque chose dans la sortie.
Mise à jour vers iOS 9
Par défaut, la fonction termine la ligne qu'elle imprime en ajoutant un saut de ligne.
Terminator
Pour imprimer une valeur sans un saut de ligne après, passez une chaîne vide comme terminateur
Séparateur
Vous pouvez maintenant utiliser le séparateur pour concaténer plusieurs éléments
Tous les deux
Ou vous pouvez combiner l'utilisation de cette manière
la source
appendNewline
a une valeur par défaut detrue
terminator : ""
, par exempleprint("...", terminator: "")
De plus, Swift 2 a
debugPrint()
(etCustomDebugStringConvertible
protocole)!N'oubliez pas
debugPrint()
ce qui fonctionneprint()
mais qui convient le mieux au débogage .Exemples:
print("Hello World!")
devientHello World
debugPrint("Hello World!")
devient"Hello World"
(Citations!)print(1..<6)
devient1..<6
debugPrint(1..<6)
devientRange(1..<6)
Toute classe peut personnaliser sa représentation de chaîne de débogage via le
CustomDebugStringConvertible
protocole.la source
DebugPrintable
protocole a été renommé enCustomDebugStringConvertible
protocole .description
estdebugDescription
que Pythonstr
est derepr
?Pour ajouter à la réponse de Rob, depuis iOS 10.0, Apple a introduit un tout nouveau système de «journalisation unifiée» qui remplace les systèmes de journalisation existants (y compris ASL et Syslog, NSLog), et surpasse également les approches de journalisation existantes en termes de performances, grâce à ses nouvelles techniques, notamment compression des données de journal et collecte de données différée.
D' Apple :
Apple recommande vivement d'utiliser
os_log
à l'avenir pour enregistrer toutes sortes de messages, y compris les informations, le débogage, les messages d'erreur en raison de ses performances nettement améliorées par rapport aux systèmes de journalisation précédents et de sa collecte de données centralisée permettant une inspection pratique des journaux et des activités pour les développeurs. En fait, le nouveau système est probablement si peu encombrant qu'il ne provoquera pas «l'effet d'observateur» là où votre bogue disparaîtra si vous insérez une commande de journalisation, interférant ainsi avec le timing du bogue.Vous pouvez en savoir plus à ce sujet dans les détails ici .
Pour résumer: utilisez
print()
pour votre débogage personnel pour plus de commodité (mais le message ne sera pas enregistré lors du déploiement sur les machines des utilisateurs). Ensuite, utilisez la journalisation unifiée (os_log
) autant que possible pour tout le reste.la source
Il existe une autre méthode appelée
dump()
qui peut également être utilisée pour la journalisation:Depuis les fonctions de bibliothèque standard de Swift
la source