LoginSignup
18

More than 5 years have passed since last update.

print()の出力をカスタマイズする

Last updated at Posted at 2015-09-19

概要

Swiftにはprintというログ出力ができるグローバル関数がありますが、実行タイミングや内容について、以下の目的を達成したいためちょっと頑張ってみました :muscle:

目的

  • Debugビルドの時以外はprintの出力を無効にする
  • Optionalがprint関数の引数に含まれる場合は、Optional()という表記を削除する

アプローチ

print関数をオーバーライドして、デバッグ時のみ有効になるようにする。

Swift
func print(value:Any...) {
#if DEBUG
    Swift.print(value)
#endif
}

一度Stringにして、Optional()の部分が出力されないよう置換する

Swift
let pattern = "Optional\\((.+)\\)"
eachMessage = eachMessage
              .stringByReplacingOccurrencesOfString(pattern,
              withString:"$1",
              options:.RegularExpressionSearch,
              range: nil)

この2つを使って最終的に以下のように作りました :star:

Swift
public func print(value:Any...){
#if DEBUG
    var message = ""
    for element in value {
        var eachMessage = "\(element)"
        let pattern = "Optional\\((.+)\\)"
        eachMessage = eachMessage
            .stringByReplacingOccurrencesOfString(pattern,
                withString:"$1",
                options:.RegularExpressionSearch,
                range: nil)
        message += eachMessage
    }
    Swift.print(message)
#endif
}

結果

  • DEBUG時のみログが出るようにする
    Other Swift FlagsにあるDebugに対して、-D DEBUGが設定されている必要があります

Debug時のみDEBUGマクロが定義されているはずなので、print関数を呼んでいてもリリース時などは無効にすることができました。

  • Optional()表記をなくす Swift標準のprint関数と今回オーバーライドした関数を呼び出すとそれぞれ以下のように出力が異なることがわかります。
    let integer:Int? = 123456
    let string:String? = nil
    let boolean:Bool? = false
    Swift.print("integer: \(integer)\nstring: \(string) \nboolean: \(boolean)")
    print("integer: \(integer)\nstring: \(string) \nboolean: \(boolean)")
    # 通常の出力
    integer: Optional(123456)
    string: nil 
    boolean: Optional(false)
    # オーバーライドしたprint()の出力
    integer: 123456
    string: nil 
    boolean: false

オーバーライドした方はOptional()の部分が表示されなくなってます!見やすい!!

まとめ

オーバーライドして頑張ることで、以下の目的を達成することができました :apple:

  • Debugビルドの時以外はprintの出力を無効にする
  • Optionalがprint関数の引数に含まれる場合は、Optional()という表記を削除する

ソースコードはこちらにあげてあります。
https://github.com/totomo/SSLogger

出力行番号や、クラス名を出したい場合は修正が入りますが、単純にprint関数を使ってログを出しているプロジェクトでは使えるかもしれません :bow:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18