[Swift 3] 型名を取得する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Swift 3 で dynamicType が削除された

Swift 2.x において、型名を取得するには dynamicType プロパティを使用する方法が一般的でした。しかし Swift 3 では dynamicType プロパティが削除され、別な方法が提供されました。

// Swift 2.x まで
let text = "Hello!"
String(text.dynamicType)

String(describing:) と type(of:) を使う

Swift 3 からは、String 型のイニシャライザとして String(describing:) が、そして値の型を取得するための関数 type(:of) 追加されました。これらを組み合わせて、型名を文字列として取得することができます。

// Swift 3 から
let text = "Bonjour!"
String(describing: type(of: text))

type-of-01

.Type のおさらい

type(:of) を使ってみると分かりますが、type(:of) で取得できる値は .Type になっています。String であれば、String.Type が取得できます。

この .Type は何かと言うと、メタタイプと呼ばれている型です。メタタイプはクラスやストラクチャ、列挙型、プロトコルが何であるか判別するための特別な型です。プロトコルだけ特別に .Protocol となります。どの型からでも使うことができるようになっています。

型名の後に .self を付けることで、型自体から取得することもできます。String(describing:) は、このメタタイプを引数と取るため、型名から型名の文字列を生成することもできます。

// ClassMethodクラスを定義
class ClassMethod {
}
// メタタイプを取得
let type = ClassMethod.self
// 型名の文字列を生成
let typeString = String(describing: type)

type-of-02

詳しくは Swift Programming Language の Metatype Type を参照してください。

まとめ

インターネット上には、まだまだ Swift 2.x の情報が多く、こういうマイナーな変更は調べるのに地味に時間を取られてしまいがちです。Developers.IO では、引き続き最新の技術情報をお届けしていきますので是非参考にしてください。

参考