web-dev-qa-db-fra.com

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

Quelle est la différence entre print, NSLog et println et quand dois-je les utiliser?

Par exemple, dans Python si je voulais imprimer un dictionnaire, je ne ferais que print myDict, mais j'ai maintenant deux autres options. Comment et quand devrais-je utiliser chacun?

411
User

Quelques différences:

  1. print vs println:

    La fonction print imprime des messages dans la console Xcode lors du débogage d'applications.

    La println est une variante de celle-ci qui a été supprimée dans Swift 2 et qui n'est plus utilisée. Si vous voyez un ancien code qui utilise println, vous pouvez maintenant le remplacer en toute sécurité par print.

    De retour dans Swift 1.x, print n'a pas ajouté de caractère de nouvelle ligne à la fin de la chaîne imprimée, alors que println l'a fait. 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 un paramètre terminator de "".

  2. NSLog:

    • NSLog est plus lent;

    • NSLog ajoute un horodatage et un identifiant à la sortie, alors que print ne le fera pas;

    • Les instructions NSLog apparaissent à la fois dans la console du périphérique et dans la console du débogueur, alors que print n'apparaît que dans la console du débogueur.

    • NSLog utilise printf- des chaînes de formatage, p. Ex.

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

      cela produira:

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

  3. À partir de iOS 10/macOS 10.12, il existe une troisième alternative, os_log, qui fait partie du système de "journalisation unifiée" (voir la vidéo WWDC 2016 Suivi unifié et suivi de l'activité ).

    • Vous devez importer os.log avant d'utiliser la fonction os_log:

      import os.log
      
    • Comme NSLog, os_log enverra des messages à la fois à la console de débogage Xcode et à la console du périphérique.

    • Vous pouvez maintenant contrôler les champs "sous-système" et "catégorie" disponibles dans l'application Console. Par exemple:

      let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network")
      os_log("url = %@", log: log, url.absoluteString)
      

      Lorsque vous observez l'application via l'application externe de la console, vous pouvez non seulement ajouter ces colonnes à la vue principale, mais également filtrer en fonction de celles-ci. C'est très utile lorsque vous souhaitez différencier vos messages de débogage de ceux (a) générés par d'autres sous-systèmes pour le compte de votre application; ou (b) des messages d'autres catégories ou types.

    • Vous pouvez spécifier différents types de messages de journalisation, soit .info, .debug, .error, .fault (ou .default):

      os_log("web service did not respond", type: .error)
      

      Ainsi, si vous utilisez l'application console externe, vous pouvez choisir de ne voir que les messages de certaines catégories (par exemple, ne montrer que 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 concernant le point de savoir si les éléments sont enregistrés sur le disque ou non. Voir la vidéo WWDC pour plus de détails.

    • Vous ne pouvez pas utiliser l'interpolation de chaîne lorsque vous utilisez os_log. Par exemple, vous ne pouvez pas faire:

      os_log("foo \(url.absoluteString)")
      

      Vous devriez faire:

      os_log("url = %@", url.absoluteString)
      
    • 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 appelée depuis le périphérique lui-même et que vous regardiez depuis l'application de la console de votre Mac, vous verriez:

      url = <privé>

      Si vous voulez le voir depuis un périphérique externe, vous devrez faire:

      os_log("url = %{public}@", url.absoluteString)
      
    • Remarque: NSLog utilise maintenant le système de notification unifié en coulisse, mais avec les réserves suivantes:

      • Vous ne pouvez pas contrôler le sous-système, la catégorie ou le type de journal.

      • Il ne prend pas en charge les paramètres de confidentialité.

En fin de compte, print est suffisant pour des tâches simples, mais NSLog est utile car il contient des informations d’horodatage.

La puissance de os_log prend tout son relief lors du débogage d'applications iOS devant être testées en dehors de Xcode. Par exemple, lorsque vous testez des processus d'application iOS en arrière-plan tels que l'extraction en arrière-plan, la connexion au débogueur Xcode modifie le cycle de vie de l'application . Par conséquent, vous voudrez souvent tester sur un périphérique physique, en exécutant l’application depuis le périphérique lui-même, sans démarrer l’application depuis le débogueur de Xcode. La journalisation unifiée vous permet de surveiller vos déclarations os_log de votre appareil iOS à partir de l’application macOS Console.

682
Rob

Si vous utilisez Swift 2, vous ne pouvez désormais utiliser que print () pour écrire quelque chose dans la sortie.

Apple a combiné les deux fonctions println () et print ().

Mise à jour vers iOS 9

Par défaut, la fonction termine la ligne imprimée en ajoutant un saut de ligne.

print("Hello Swift")

Terminateur

Pour imprimer une valeur sans saut de ligne après celle-ci, transmettez une chaîne vide en tant que terminateur.

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

séparateur

Vous pouvez maintenant utiliser separator pour concaténer plusieurs éléments

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

les deux

Ou vous pouvez combiner en utilisant de cette façon

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

De plus, Swift 2 a debugPrint() (et le protocole CustomDebugStringConvertible)!

N'oubliez pas de debugPrint() qui fonctionne comme print() mais plus approprié pour le débogage .

Exemples:

  • Chaînes
    • print("Hello World!") devient Hello World
    • debugPrint("Hello World!") devient "Hello World" (Citations!)
  • Gammes
    • print(1..<6) devient 1..<6
    • debugPrint(1..<6) devient Range(1..<6)

Toute classe peut personnaliser la représentation de leur chaîne de débogage via le protocole CustomDebugStringConvertible.

60
Valentin Shergin

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 la compression des données de journal et la collecte de données différée.

De Apple :

Le système de journalisation unifiée fournit une API unique, efficace et performante pour la capture de la messagerie à tous les niveaux du système. Ce système unifié centralise le stockage des données de journal en mémoire et dans un magasin de données sur disque.

Apple recommande vivement d'utiliser os_log à l'avenir pour consigner toutes sortes de messages, y compris les informations, les messages de débogage et d'erreur, en raison de ses performances nettement meilleures que celles des systèmes de journalisation précédents, et de sa collecte de données centralisée permettant un contrôle pratique des activités et des journaux pour les développeurs. . En fait, le nouveau système a probablement une empreinte si faible qu'il ne causera pas l'effet "observateur", qui supprime votre bogue si vous insérez une commande de journalisation, ce qui perturbe le moment où le bogue se produit.

Performance of Activity Tracing, now part of the new Unified Logging system

Vous pouvez en apprendre plus à ce sujet en détail ici .

Pour résumer: utilisez print() pour votre propre débogage pour plus de commodité (mais le message ne sera pas enregistré lors du déploiement sur des machines utilisateur). Ensuite, utilisez la journalisation unifiée (os_log) autant que possible pour tout le reste.

32
HuaTham

Il existe une autre méthode appelée dump() qui peut également être utilisée pour la journalisation:

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

Vide le contenu d’un objet à l’aide de son miroir vers la sortie standard.

De fonctions de la bibliothèque Swift Standard

3
JAL