追記: パッケージ化した → 1024jp/Moof –GitHub
自分で使ってるデバッグ関数がそこそこ便利なので単に自慢したいだけです。
それがこの moof()
コマンドだ。ただー!
/// debug friendly print with a dog/cow.
func moof(_ items: Any..., function: String = #function) {
let icon = Thread.isMainThread ? "🐕" : "🐄"
Swift.print(icon + " \(function) ", terminator: "")
if items.isEmpty {
Swift.print("")
} else {
Swift.debugPrint(items)
}
}
こうやって使います。
override drawBackground(in rect: NSRect) {
moof("rect", rect)
super.drawBackground(in: rect)
}
するとこんな行がプリントされます。
🐕 drawBackground(in:) ["rect", (0.0, 0.0, 4.0, 4.0)]
基本的には Swift.debugPrint()
なんだけどこのあたりが良いです。
- 被らない
- iOS の人には関係ないのかもしれないけど、AppKit では NSView なんかに
print(_ sender: Any?)
というメソッドがもともと生えてるので、迂闊にデバッグ行埋め込むつもりでprint("foobar")
などと書くと怒られることがあります。moof
なら少ないタイプ数ながら既存のメソッド/関数とはまず被らないでしょう。
- iOS の人には関係ないのかもしれないけど、AppKit では NSView なんかに
- 埋もれない
- 行頭が絵文字から始まっていますがこれがポイントで、システムが他のログをたくさんはいていても、絵文字が目立つので自分が吐いたログがすぐに見つかります。
- 呼び出しスレッドがわかる
- このコマンドは、メインスレッドから呼び出されたら🐕が、バックグラウンドスレッドから呼び出されたら🐄がプリントされます。メインスレッドでしか実行されないと思っていたら実はバックグラウンドスレッドでした!みたいな時にいち早く原因に気づけます。いちいち
print(Thread.isMainThread ? "main" : "background")
とか書いてらんないもんね。
- このコマンドは、メインスレッドから呼び出されたら🐕が、バックグラウンドスレッドから呼び出されたら🐄がプリントされます。メインスレッドでしか実行されないと思っていたら実はバックグラウンドスレッドでした!みたいな時にいち早く原因に気づけます。いちいち
- 呼び出しメソッド名を自動でプリント
- どこで呼んだすぐわかって便利ですね。単にそこを通ってるか知りたいだけの時は
moof()
と書けばいいだけで簡単。
- どこで呼んだすぐわかって便利ですね。単にそこを通ってるか知りたいだけの時は
そんな感じです。便利だよ。CotEditor でも活躍してます。
「なんで関数名 moof
なんだよ」とか「なんでまた🐕と🐄」とかは、Macintosh おじさんの歪んだ愛情だと理解していただければいいんじゃないかと思います。実際にはなんでもいいです。
こちらからは以上です。