Xcode7(Swift2) でデバッグビルドの時だけデバッグ出力して、プロダクションビルドの時はセキュリティのためデバッグログを削る方法のメモ。
このコードにより、print, debugPrintln, NSLogの出力を制御することができます。
事前準備
XcodeプロジェクトのBuild Settings → Swift Compiler → Other Swift Flags の Debug に「-DDEBUG」を追加して下さい。
コード
AppDelegate.swift の冒頭に以下のグローバル関数を追加します。
他のファイルのほうがわかりやすければAppDelegate以外でも大丈夫です。
// リリースビルドでprint, debugPrintを無効化 func print(object: Any) { #if DEBUG Swift.print(object, terminator: "") #endif } func debugPrint(object: Any) { #if DEBUG Swift.debugPrint(object, terminator: "") #endif } // リリースビルドでNSLog無効化 func NSLog(message:String){ #if DEBUG Foundation.NSLog(message) #endif } func NSLog(format:String, _ args:CVarArgType...){ #if DEBUG Foundation.NSLog(String(format: format, arguments: args)) #endif }
この記事を書いた理由
print, debugPrintは出てきますが、SwiftでNSLogを非表示にする方法がどうしても出てこなかったので記事にしました。
Swift2から廃止されたprintln, debugPrintlnはここに書いていませんが、print, debugPrint と同様の方法で対応可能です。
ググると NSLogを消す方法として、プレフィクスヘッダファイル(.pchファイル)に #define NSLog を方法が出てきますが、こちらはObjective Cにしか効果がないようなので注意。
おまけ
代替案としては、より細かいログレベル制御が可能なXCGLoggerを使うのも手です。
AppDelegateで
import XCGLogger let log: XCGLogger = { let log = XCGLogger.defaultInstance() #if DEBUG log.setup(.Debug, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil) #else log.setup(.Severe, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil) #endif let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "MM/dd/yyyy hh:mma" dateFormatter.locale = NSLocale.currentLocale() log.dateFormatter = dateFormatter return log }()
としておくと、
log.debug("Debugレベルのログです") log.info("infoレベルのログです")
のようにログレベルごとのログ出力ができるようになります。