Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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-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)"
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away