何の違いだprint
、NSLog
とprintln
してたとき、私はそれぞれを使用する必要がありますか?
たとえば、Pythonで辞書を印刷したい場合は、をprint myDict
使用しますが、今では他に2つのオプションがあります。いつ、どのように使用すればよいですか?
何の違いだprint
、NSLog
とprintln
してたとき、私はそれぞれを使用する必要がありますか?
たとえば、Pythonで辞書を印刷したい場合は、をprint myDict
使用しますが、今では他に2つのオプションがあります。いつ、どのように使用すればよいですか?
回答:
いくつかの違い:
print
vs println
:
このprint
関数は、アプリのデバッグ時にXcodeコンソールにメッセージを出力します。
これprintln
はSwift 2で削除されたバリエーションで、現在は使用されていません。を使用している古いコードがprintln
見つかった場合は、安全にそれをに置き換えることができますprint
。
Swift 1.xに戻ってprint
、印刷された文字列の最後に改行文字を追加しませんprintln
でした。しかし、今日では、print
常に文字列の最後に改行文字を追加します。それを望まない場合は、terminator
パラメータを指定します""
。
NSLog
:
NSLog
遅いです。
NSLog
タイムスタンプと識別子を出力に追加しますが、追加しprint
ません。
NSLog
ステートメントはデバイスのコンソールとデバッガのコンソールの両方に表示されprint
ますが、デバッガコンソールにのみ表示されます。
NSLog
printf
-style形式の文字列を使用します。
NSLog("%0.4f", CGFloat.pi)
それは生成されます:
2017-06-09 11:57:55.642328-0700 MyApp [28937:1751492] 3.1416
効果的なiOS 10 / macOS 10.12にos_log
は、「統合ログ」システムの3番目の代替手段があります(WWDC 2016ビデオの統合ログとアクティビティトレースを参照)。
関数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のデバッガーからアプリを起動するのではなく、物理的なデバイスでテストし、デバイス自体からアプリを実行することがよくあります。統合ログos_log
により、macOSコンソールアプリからiOSデバイスのステートメントを監視できます。
print
、Xcodeのデバッグ領域にと同様に表示されdebugPrint
ます。唯一の違いは、あるprint
呼び出して終了description
オブジェクトのメソッド、およびdebugPrint
呼び出しdebugDescription
より冗長以上であってもよいですdescription
。
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:".")
appendNewline
デフォルト値はtrue
terminator : ""
では、を使用する必要があります。例:print("...", terminator: "")
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
プロトコルを介してデバッグ文字列表現をカスタマイズできます。
DebugPrintable
プロトコルはに名前が変更されましたCustomDebugStringConvertible
プロトコル。
description
にあるdebugDescription
Pythonのがようstr
にありますかrepr
?
ロブの答えに追加するために、AppleはiOS 10.0以降、既存のロギングシステム(ASLとSyslog、NSLogを含む)に取って代わるまったく新しい「統合ロギング」システムを導入しました。ログデータの圧縮と遅延データ収集。
アップルから:
統合ロギングシステムは、システムのすべてのレベルにわたるメッセージングをキャプチャするための単一の効率的な高性能APIを提供します。この統合システムは、ログデータのストレージをメモリとディスク上のデータストアに集中化します。
Apple os_log
は、以前のロギングシステムと比較してパフォーマンスが大幅に向上し、開発者にとって便利なログとアクティビティの検査を可能にする一元化されたデータ収集により、情報、デバッグ、エラーメッセージを含むあらゆる種類のメッセージをログに記録することを強くお勧めします。実際、新しいシステムはフットプリントが非常に低いため、ロギングコマンドを挿入するとバグが消え、バグの発生のタイミングを妨げる「オブザーバー効果」が発生しない可能性があります。
要約print()
すると、便宜上、個人的なデバッグに使用します(ただし、ユーザーのデバイスにデプロイした場合、メッセージはログに記録されません)。次に、os_log
他のすべてに対して、可能な限り統合ログ()を使用します。
dump()
ロギングにも使用できる別のメソッドが呼び出されます。
func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)
ミラーを使用してオブジェクトの内容を標準出力にダンプします。