何の違いだprint、NSLogとprintlnしてたとき、私はそれぞれを使用する必要がありますか?
たとえば、Pythonで辞書を印刷したい場合は、をprint myDict使用しますが、今では他に2つのオプションがあります。いつ、どのように使用すればよいですか?
何の違いだprint、NSLogとprintlnしてたとき、私はそれぞれを使用する必要がありますか?
たとえば、Pythonで辞書を印刷したい場合は、をprint myDict使用しますが、今では他に2つのオプションがあります。いつ、どのように使用すればよいですか?
回答:
いくつかの違い:
printvs println:
このprint関数は、アプリのデバッグ時にXcodeコンソールにメッセージを出力します。
これprintlnはSwift 2で削除されたバリエーションで、現在は使用されていません。を使用している古いコードがprintln見つかった場合は、安全にそれをに置き換えることができますprint。
Swift 1.xに戻ってprint、印刷された文字列の最後に改行文字を追加しませんprintlnでした。しかし、今日では、print常に文字列の最後に改行文字を追加します。それを望まない場合は、terminatorパラメータを指定します""。
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
効果的なiOS 10 / macOS 10.12にos_logは、「統合ログ」システムの3番目の代替手段があります(WWDC 2016ビデオの統合ログとアクティビティトレースを参照)。
関数os.logを使用os_logする前にインポートする必要があります:
import os.logのようにNSLog、os_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デバイスのステートメントを監視できます。
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にあるdebugDescriptionPythonのがよう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)ミラーを使用してオブジェクトの内容を標準出力にダンプします。