print
、NSLog
、println
の違いは何ですか?また、いつ使用するべきですか?
例えば、Pythonで私が辞書を印刷したいのなら、私はprint myDict
だけですが、今は他に2つの選択肢があります。どのようにそしていつ私はそれぞれを使うべきですか?
いくつかの違い:
print
とprintln
:
print
関数は、アプリケーションをデバッグするときにXcodeコンソールにメッセージを出力します。
println
は、Swift 2で削除されたこのバリエーションであり、もう使用されていません。 println
を使用している古いコードが表示されたら、安全にprint
に置き換えることができます。
Swift 1.xに戻ると、print
は出力文字列の末尾に改行文字を追加しませんでしたが、println
は追加しませんでした。しかし今日では、print
は常に文字列の末尾に改行文字を追加します。それをしたくない場合は、terminator
パラメーターに""
を指定します。
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
効果的な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
ステートメントを見ることを可能にします。
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:".")
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
プロトコルを介してデバッグ文字列表現をカスタマイズできます。
Rob 10.0の回答に加えて、iOS 10.0以降、Appleは既存のロギングシステム(ASLやSyslog、NSLogを含む)に取って代わるまったく新しい "Unified Logging"システムを導入しました。ログデータの圧縮と遅延データの収集。
アップル :から
統合ロギングシステムは、システムのすべてのレベルでメッセージングをキャプチャするための単一の効率的で高性能なAPIを提供します。この統合システムは、ログデータをメモリ内とディスク上のデータストアに集中的に格納します。
Appleは、os_log
を使ってinfo、debug、エラーメッセージを含むあらゆる種類のメッセージをログに記録することを強くお勧めします。これは以前のロギングシステムと比べてパフォーマンスがはるかに向上したことです。実際、新しいシステムはフットプリントが非常に小さいため、loggingコマンドを挿入してもバグが消える「オブザーバ効果」が発生しないため、バグの発生タイミングが妨げられることはありません。
あなたは詳細についてこれについてもっと学ぶことができます ここ 。
要約すると、あなたの個人的なデバッグのためにprint()
を使っています(ただし、ユーザーデバイスにデプロイされたときにはメッセージは記録されません)。それから、それ以外のものすべてに可能な限り統一されたロギング(os_log
)を使用してください。
ロギングにも使用できるdump()
という別のメソッドがあります。
func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)
ミラーを使ってオブジェクトの内容を標準出力にダンプします。
From Swift標準ライブラリ関数