Swift:print()とprintln()とNSLog()


450

何の違いだprintNSLogprintlnしてたとき、私はそれぞれを使用する必要がありますか?

たとえば、Pythonで辞書を印刷したい場合は、をprint myDict使用しますが、今では他に2つのオプションがあります。いつ、どのように使用すればよいですか?



2
NSLogについてはどうですか。NSDictionaryを印刷しても何も役に立ちません。
ユーザー、

iOS 10.0以降では、を使用することをお勧めしますos_log以下の私の答えを見てください。
HuaTham

上スウィフトのマニュアルを見に加えてos_log見てみてください。完全なドキュメントのObjective-Cのページのを。より完全です。
ハニー

回答:


758

いくつかの違い:

  1. printvs println

    このprint関数は、アプリのデバッグ時にXcodeコンソールにメッセージを出力します。

    これprintlnはSwift 2で削除されたバリエーションで、現在は使用されていません。を使用している古いコードがprintln見つかった場合は、安全にそれをに置き換えることができますprint

    Swift 1.xに戻ってprint、印刷された文字列の最後に改行文字を追加しませんprintlnでした。しかし、今日では、print常に文字列の最後に改行文字を追加します。それを望まない場合は、terminatorパラメータを指定します""

  2. NSLog

    • NSLog 遅いです。

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

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

    • NSLogprintf-style形式の文字列を使用します。

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

      それは生成されます:

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

  3. 効果的なiOS 10 / macOS 10.12にos_logは、「統合ログ」システムの3番目の代替手段があります(WWDC 2016ビデオの統合ログとアクティビティトレースを参照)。

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

      import os.log
    • のようにNSLogos_logXcodeデバッグコンソールとデバイスコンソールの両方にもメッセージを出力します

    • コンソールアプリで使用可能な「サブシステム」および「カテゴリ」フィールドを制御できるようになりました。例えば:

      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_logXcodeの外部でテストする必要のあるiOSアプリをデバッグするときに、の力が非常に軽減されます。たとえば、バックグラウンドフェッチなどのバックグラウンドiOSアプリプロセスをテストする場合、Xcodeデバッガーに接続すると、アプリのライフサイクルが変わります。そのため、Xcodeのデバッガーからアプリを起動するのではなく、物理的なデバイスでテストし、デバイス自体からアプリを実行することがよくあります。統合ログos_logにより、macOSコンソールアプリからiOSデバイスのステートメントを監視できます。


37
いいまとめ!さらにいくつか追加するには、printStringにNSStringを渡すことができますが、NSLogを渡すことはできません。NSLogの引数を追加できますが、printlnは追加できません。Swiftスタイルの文字列補間がNSLogでクラッシュすることがありますが、printlnではクラッシュしません。
Bao Lei

2
Swiftコンパイラの最適化とprint()medium.com/ios-os-x-development/…の
Carl

@Rob私が印刷を使用する場合、デバッガコンソールに表示されますか?それともdebugPrintを使用する必要がありますか?

1
を使用するとprint、Xcodeのデバッグ領域にと同様に表示されdebugPrintます。唯一の違いは、あるprint呼び出して終了descriptionオブジェクトのメソッド、およびdebugPrint呼び出しdebugDescriptionより冗長以上であってもよいですdescription
Rob

@ハニー、このコメントスレッドは長すぎるというフラグが立てられたので、コメントは拡張ディスカッションまたはデバッグセッション用ではないことを思い出させたいだけです。スタックオーバーフロー形式に適した質問として質問できるものがある場合は、質問に回答してください。そうすれば、誰もがその回答から利益を得ることができます。質問として機能しない場合は、チャットするためにディスカッションを行う必要があります。説明を求めたり、迅速に観察したりするためだけにコメントを予約してください。
コーディグレイ

80

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:".")

5
appendNewlineデフォルト値はtrue
Adam

1
iOS(9.0)terminator : ""では、を使用する必要があります。例:print("...", terminator: "")
Khotu Nam

最初の文の記述が間違っています。NSLog()は、最新のSwift 2.xでも動作します
Sebastian

62

さらに、Swift 2にはdebugPrint()(そしてCustomDebugStringConvertibleプロトコルも)あります!

debugPrint()どのように動作するかを忘れないでくださいprint()デバッグに最適です

例:

  • 文字列
    • print("Hello World!") なる Hello World
    • debugPrint("Hello World!")になる"Hello World"(引用!)
  • 範囲
    • print(1..<6) なる 1..<6
    • debugPrint(1..<6) なる Range(1..<6)

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


2
DebugPrintableプロトコルはに名前が変更されましたCustomDebugStringConvertibleプロトコル
フランクリン・ユー

ありがとう、フランクリン!
Valentin Shergin、2016年

ですので、スウィフトはdescriptionにあるdebugDescriptionPythonのがようstrにありますかrepr
BallpointBen 2017

はい、そう思います。
Valentin Shergin 2017

39

ロブの答えに追加するために、AppleはiOS 10.0以降、既存のロギングシステム(ASLとSyslog、NSLogを含む)に取って代わるまったく新しい「統合ロギング」システムを導入しました。ログデータの圧縮と遅延データ収集。

アップルから:

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

Apple os_logは、以前のロギングシステムと比較してパフォーマンスが大幅に向上し、開発者にとって便利なログとアクティビティの検査を可能にする一元化されたデータ収集により、情報、デバッグ、エラーメッセージを含むあらゆる種類のメッセージをログに記録することを強くお勧めします。実際、新しいシステムはフットプリントが非常に低いため、ロギングコマンドを挿入するとバグが消え、バグの発生のタイミングを妨げる「オブザーバー効果」が発生しない可能性があります。

新しいユニファイドロギングシステムの一部であるアクティビティトレースのパフォーマンス

詳細については、こちらをご覧ください

要約print()すると、便宜上、個人的なデバッグに使用します(ただし、ユーザーのデバイスにデプロイした場合、メッセージはログに記録されません)。次に、os_log他のすべてに対して、可能な限り統合ログ()を使用します。


5

dump()ロギングにも使用できる別のメソッドが呼び出されます。

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

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

スウィフト標準ライブラリ関数

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.