読者です 読者をやめる 読者になる 読者になる

Swiftで自分のクラス名を表示する方法

Swiftで自分のクラス名を表示する方法

NSOdjectのサブクラスのdiscriptionメソッドとかで自分のクラス名を表示したいと思ったのだけど、

Swiftではself.classが使えない。

discriptionメソッドで使うだけなので別にクラス名直書きでもいいのだけれど、

なんだかすっきりしないので調べてみた。

コンソール出力や、Unit testなどでクラスを比較するときに使える。

サンプルプロジェクト

https://github.com/satomikko94/PrintProjectName

実行結果

(コンソール出力)

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-Cself.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)"

Qiitaにも投稿してみた

Swiftで自分のクラス名を表示する方法 - Qiita