定食屋おろポン

おろしポン酢と青ネギはかけ放題です

Swiftでデバッグ出力(日時、メソッド名、行番号)

メソッド名と行番号

かつてObjective-Cではこのように書いていた時代があった。

NSLog(@"%s, %d", __PRETTY_FUNCTION__, __LINE__);

今日からはこう書ける!*1

println(__FUNCTION__, __LINE__)

//=> (someFunction(), 60)

Swiftのprintlnは、NSLogと違って現在時間が表示されない。 出力したければNSDateを使えばよい。

println(String(NSDate.date().description), __FUNCTION__, __LINE__)

//=> (2014-06-04 13:34:18 +0000, someFunction()someFunction(), 63)

追記: 普通にNSLogも使えるので使えばよい。

特殊リテラルには以下があるので好きに使うと良い

  • __COLUMN__
  • __FILE__
  • __FUNCTION__
  • __LINE__

デバッグ用出力

Swiftは文字列中で変数を展開できる。

let name = "oropon"
let greeting = "My name is \(name)"

println(greeting) //=> My name is oropon

ここで\( )の中に入れられるのは「文字列化」できる変数のみ。 自分で定義したクラスを「文字列化」できるようにするには、Printableプロトコルに準拠してやる必要がある。

class MyClass :Printable {
    var description: String { return "MyClassだよー" }
}

要するに、println(hoge)や、"this is \(hoge)"のように文字列化するhogeはdescriptionメソッドを持っていてPrintableプロトコルに準拠してないとダメだよ、という話。

以下余談

Printableプロトコルと似たようなプロトコルに、DebugPrintableプロトコルというものがある。なんだか夢が膨らみそうな名前だ。

ドキュメントにはこのように書いてあるが、やってみてもうまく動かないし、正直DebugPrintableプロトコルが何のためにあるのかよく分からない。。

// set a breakpoint and type p value in the LLDB console
// you'll see "MyType: Untitled"

*1:全然変わってない