新しいロギングおよびアクティビティのトレースAPIのサポートを、最新バージョンをまだ採用していないユーザーの下位互換性を維持する方法でライブラリに追加しようとしています。 OS(iOSまたはmacOS)。私はロギングの各レベルごとにカスタムロギングマクロを定義しており、古いOSではNSLog
に戻っています。私はこの問題を1つの問題で解決しました。下位互換性を維持しながらos_log APIを採用する
新しいAPIでは、ログ出力に表示する場合は、非定数、非スカラー値を明示的にpublic
とマークする必要があります。これは次のように私のマクロの呼び出しが見えるものです:これはos_log
(例えばiOSの後に10.0)を含んSDKと罰金コンパイル
UZKLogInfo("Reading file %{public}@ from archive", fileName);
が、私は以前のバージョンでコンパイルするときに、私のマクロはNSLog
にフォールバック
そして、このようなログ行印刷されたルックスを使用
:、私は、コンパイラの警告が表示されます
Reading file <decode: missing data> from archive
これは私のマクロ定義の簡略版(のみ
info
定義を含むと簡素化され、条件:#if UNIFIED_LOGGING_SUPPORTED @import os.log; #define UZKLogInfo(format, ...) os_log_info(OS_LOG_DEFAULT, format, ##__VA_ARGS__); #else // Fall back to regular NSLog #define UZKLogInfo(format, ...) NSLog(@format, ##__VA_ARGS__); #endif
の「{公共}」テキスト(いくつかの種類を取り除くためにどのような方法があります文字列の置換?)
format
からフォールバックの場合?または、ログに常に表示されているレベルの情報を放棄することなく、古いAPIと新しいAPIをサポートする別の方法がありますか?マクロを使用する必要があります(last year's WWDC session on the topicに従うか、そうでないとコールサイトのメタデータが失われます)
「文字列置換のいくつかの種類が」聞こえますあなた自身の質問です。 NSStringは提供していますか? – CRD
@CRDしかし、私が置き換えをしたいのは 'NSString'ではなく、ソースファイルからマクロに置かれたテキストです。メモリ内に割り当てられたオブジェクトではありません。プリプロセッサがどのような機能を利用できるのかよく分かりませんが、NSStringのメソッドを利用する方法はないと思います。 – Dov
'@ format'はNSStringですが、文字列がプログラムで生成されているかどうかは関係ありません。リテラルでもNSStringです。コンパイル中に文字列を変更することはできませんが、実行時に変更することは可能です。マクロには 'NSLog'呼び出しが含まれています。メソッド呼び出しを含めることができます。 – CRD