web-dev-qa-db-ja.com

速い:print()vs println()vs NSLog()

printNSLogprintlnの違いは何ですか?また、いつ使用するべきですか?

例えば、Pythonで私が辞書を印刷したいのなら、私はprint myDictだけですが、今は他に2つの選択肢があります。どのようにそしていつ私はそれぞれを使うべきですか?

391
User

いくつかの違い:

  1. printprintln

    print関数は、アプリケーションをデバッグするときにXcodeコンソールにメッセージを出力します。

    printlnは、Swift 2で削除されたこのバリエーションであり、もう使用されていません。 printlnを使用している古いコードが表示されたら、安全にprintに置き換えることができます。

    Swift 1.xに戻ると、printは出力文字列の末尾に改行文字を追加しませんでしたが、printlnは追加しませんでした。しかし今日では、printは常に文字列の末尾に改行文字を追加します。それをしたくない場合は、terminatorパラメーターに""を指定します。

  2. NSLog

    • NSLogは遅くなります。

    • NSLogは出力にタイムスタンプと識別子を追加しますが、printは追加しません。

    • NSLogステートメントはデバイスのコンソールとデバッガのコンソールの両方に表示されますが、printはデバッガコンソールにのみ表示されます。

    • NSLogは、printfスタイルのフォーマット文字列を使用します。

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

      それは作り出すでしょう:

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

  3. 効果的なiOS 10/macOS 10.12では、 "unified logging"システムの一部であるos_logがあります(WWDC 2016 video Unified Logging and Activity Tracing を参照)。

    • os.log関数を使用する前に、os_logをインポートする必要があります。

      import os.log
      
    • NSLogと同様に、os_logはXcodeデバッグコンソールとデバイスコンソールの両方にメッセージを出力します。

    • これで、コンソールアプリケーションで利用可能な「サブシステム」フィールドと「カテゴリ」フィールドを制御できます。例えば:

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

      外部のコンソールアプリでアプリを観察するとき、メインビューにこれらの列を追加するだけでなく、これらに基づいてフィルタリングすることもできます。あなたのデバッグメッセージを(a)あなたのアプリの代わりに他のサブシステムによって生成されたものと区別したいときにとても便利です。 (b)他のカテゴリーまたはタイプからのメッセージ。

    • .info.debug.error.fault(または.default)のいずれかの異なる種類のロギングメッセージを指定できます。

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

      そのため、外部コンソールアプリケーションを使用している場合は、特定のカテゴリのメッセージのみを表示するように選択できます(たとえば、コンソールの[アクション]メニューで[デバッグメッセージを含める]を選択した場合のみデバッグメッセージを表示)。これらの設定はまた、物事がディスクに記録されているかどうかについての多くの微妙な問題の詳細を規定します。詳細については、WWDCのビデオを参照してください。

    • os_logを使用するときは、文字列補間を使用できません。たとえば、できません。

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

      あなたがしなければならないでしょう:

      os_log("url = %@", url.absoluteString)
      
    • 上記の制限の理由の1つはデータのプライバシーをサポートすることです。プリミティブデータ型(例えば数字)はデフォルトではパブリックであり、オブジェクト(例えば文字列)はデフォルトではプライベートです。 URLをログに記録した前の例では、アプリがデバイス自体から起動され、Macのコンソールアプリから見ていた場合は、次のように表示されます。

      url = <プライベート>

      あなたが外部デバイスからそれを見たいのなら、あなたはしなければならないでしょう:

      os_log("url = %{public}@", url.absoluteString)
      
    • NSLogは、舞台裏で統一された通知システムを使用するようになりましたが、次のような注意点があります。

      • サブシステム、カテゴリ、またはログタイプを制御することはできません。

      • プライバシー設定はサポートされていません。

最後のprintは単純なタスクには十分ですが、NSLogはタイムスタンプ情報を含んでいるので便利です。

os_logの力は、Xcodeの外部でテストされなければならないiOSアプリケーションをデバッグするときに、非常に安心になります。たとえば、バックグラウンドフェッチのようなバックグラウンドのiOSアプリケーションプロセスをテストするときに、Xcodeデバッガに接続すると アプリケーションのライフサイクルが変わります 。そのため、Xcodeのデバッガからアプリケーションを起動するのではなく、デバイス自体からアプリケーションを実行しながら、物理的なデバイスでテストすることがよくあります。統一されたログ記録はあなたがまだあなたのiOSデバイスのmacOSコンソールアプリからのos_logステートメントを見ることを可能にします。

656
Rob

Swift 2 を使用している場合は、print()を使用して何かを出力に書き込むことができます。

Appleは println() print() の両方の機能を1つにまとめました。

iOS 9にアップデート /

デフォルトでは、この関数は改行を追加して印刷する行を終了します。

print("Hello Swift")

ターミネータ

改行なしで値を表示するには、ターミネータとして空の文字列を渡します。

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

セパレータ

これで、区切り記号を使用して複数の項目を連結できます

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

両方

または、このように組み合わせて使うこともできます

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

さらに、Swift 2にはdebugPrint()およびCustomDebugStringConvertibleプロトコル)があります。

debugPrint()のように動作するprint()を忘れないでください(debugging に最適です)。

例:

  • 文字列
    • print("Hello World!")Hello Worldになります
    • debugPrint("Hello World!")"Hello World"になります。
  • 範囲
    • print(1..<6)1..<6になります
    • debugPrint(1..<6)Range(1..<6)になります

どのクラスもCustomDebugStringConvertibleプロトコルを介してデバッグ文字列表現をカスタマイズできます。

60

Rob 10.0の回答に加えて、iOS 10.0以降、Appleは既存のロギングシステム(ASLやSyslog、NSLogを含む)に取って代わるまったく新しい "Unified Logging"システムを導入しました。ログデータの圧縮と遅延データの収集。

アップル :から

統合ロギングシステムは、システムのすべてのレベルでメッセージングをキャプチャするための単一の効率的で高性能なAPIを提供します。この統合システムは、ログデータをメモリ内とディスク上のデータストアに集中的に格納します。

Appleは、os_logを使ってinfo、debug、エラーメッセージを含むあらゆる種類のメッセージをログに記録することを強くお勧めします。これは以前のロギングシステムと比べてパフォーマンスがはるかに向上したことです。実際、新しいシステムはフットプリントが非常に小さいため、loggingコマンドを挿入してもバグが消える「オブザーバ効果」が発生しないため、バグの発生タイミングが妨げられることはありません。

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

あなたは詳細についてこれについてもっと学ぶことができます ここ

要約すると、あなたの個人的なデバッグのためにprint()を使っています(ただし、ユーザーデバイスにデプロイされたときにはメッセージは記録されません)。それから、それ以外のものすべてに可能な限り統一されたロギング(os_log)を使用してください。

30
HuaTham

ロギングにも使用できるdump()という別のメソッドがあります。

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

ミラーを使ってオブジェクトの内容を標準出力にダンプします。

From Swift標準ライブラリ関数

3
JAL