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:全然変わってない