LoginSignup
40
34

More than 3 years have passed since last update.

Swift で便利なmyデバッグ関数

Last updated at Posted at 2016-09-17

追記: パッケージ化した → 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 なら少ないタイプ数ながら既存のメソッド/関数とはまず被らないでしょう。
  • 埋もれない
    • 行頭が絵文字から始まっていますがこれがポイントで、システムが他のログをたくさんはいていても、絵文字が目立つので自分が吐いたログがすぐに見つかります。
  • 呼び出しスレッドがわかる
    • このコマンドは、メインスレッドから呼び出されたら🐕が、バックグラウンドスレッドから呼び出されたら🐄がプリントされます。メインスレッドでしか実行されないと思っていたら実はバックグラウンドスレッドでした!みたいな時にいち早く原因に気づけます。いちいち print(Thread.isMainThread ? "main" : "background") とか書いてらんないもんね。
  • 呼び出しメソッド名を自動でプリント
    • どこで呼んだすぐわかって便利ですね。単にそこを通ってるか知りたいだけの時は moof() と書けばいいだけで簡単。

そんな感じです。便利だよ。CotEditor でも活躍してます

「なんで関数名 moof なんだよ」とか「なんでまた🐕と🐄」とかは、Macintosh おじさんの歪んだ愛情だと理解していただければいいんじゃないかと思います。実際にはなんでもいいです。

こちらからは以上です。

40
34
0

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
40
34