Swiftで自分のクラス名を表示する方法
NSOdjectのサブクラスのdiscriptionメソッドとかで自分のクラス名を表示したいと思ったのだけど、
Swiftではself.classが使えない。
discriptionメソッドで使うだけなので別にクラス名直書きでもいいのだけれど、
なんだかすっきりしないので調べてみた。
コンソール出力や、Unit testなどでクラスを比較するときに使える。
サンプルプロジェクト
実行結果
(コンソール出力)
Class name : PrintProjectName.PrintClassName or
Class name : PrintProjectName.PrintClassName
解説
PrintClassName内のdescriptionメソッドで、
{Project Name}.{Class Name}
の形式でクラス名(及びプロジェクト名)を返している。
func description() -> String {
return "Class name : \(NSStringFromClass(self.dynamicType)) or \nClass name : \(reflect(self).summary)"
}
NSStringFromClass(self.dynamicType)
dynamicTypeを使うと、インスタンスのクラス自身(サブクラス化されていればサブクラス)が参照される。
(参考 : インスタンスメソッド内でクラスメソッドを呼ぶ #Swift)
Objective-Cのself.class
とだいたいおなじようにself.dynamicType
が使えると思われる。
ただ、self.dynamicType
はそのままコンソール出力すると(MetaType)
と出力されるだけなので、
NSStringFromClass
を利用してStringに変換すればOK!
reflect(self).summary
reflect()
メソッドはオブジェクトの情報を取得するメソッド。
そこに.summary
をつけることで、String形式に変換している。
これじゃだめだった
println("\(self.dynamicType)")
// Prints "(Metatype)"
println("\(object_getClassName(self))");
// Prints "0x7b680910 (Pointer)"
println("\(self.className)")
// Compile error!
println(PrintClassName.self)
// Prints "(Metatype)"