概要
Swiftにはprintというログ出力ができるグローバル関数がありますが、実行タイミングや内容について、以下の目的を達成したいためちょっと頑張ってみました
目的
- 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つを使って最終的に以下のように作りました
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()
の部分が表示されなくなってます!見やすい!!
まとめ
オーバーライドして頑張ることで、以下の目的を達成することができました
- Debugビルドの時以外はprintの出力を無効にする
- Optionalがprint関数の引数に含まれる場合は、Optional()という表記を削除する
ソースコードはこちらにあげてあります。
https://github.com/totomo/SSLogger
出力行番号や、クラス名を出したい場合は修正が入りますが、単純にprint関数を使ってログを出しているプロジェクトでは使えるかもしれません