2016年03月21日

Swift: クラス名を取得する


SwiftのクラスにはObjective-CのNSObjectにあったclassNameプロパティのようなものがないので、文字列でクラス名を取得するには工夫が必要。

Objective-Cのメソッドを使ってNSStringFromClass(String)のようにする。これを実行するにはFoundationをインポートする必要がある。
※Stringは構造体であってクラスではないが、Swiftでは構造体やクラスはタイプという上位概念で包含され様々な点で似た振る舞いをする。

ただし、独自に定義したクラスではランタイムモジュールを含めた修飾が定義したクラス名の前につくのでこれを削除する必要がある。結局、以下のようになる。

import Foundation

func className(type: AnyClass) -> String {
print("AnyClass : ", terminator:"" )
// print( NSStringFromClass(type) ) // "__lldb_expr_198.Root"
return NSStringFromClass(type).componentsSeparatedByString(".").last!
}

class Root { }
className( Root ) // "Root"


単にクラス名を出力するだけであればprint( Root.self )のようにしても"Root"という結果が得られるのだが、これはprintメソッドが内部でクラス名文字列を取り出す処理を行っているだけのようだ。文字列として取り出して使うことはできない。

インスタンスからそのクラス名を取り出すには、同様に出力だけならprint( Root() )でできる。が、ちゃんとするには先ほどのメソッドに Root().dynamicType を渡すとよい。

func className(o: AnyObject) -> String {
print("AnyObject : ", terminator:"" )
return className(o.dynamicType)
}

let root = Root()
className(root)

続きを読む
ラベル:Swift クラス
posted by 永遠製作所 at 01:16| 東京 ☀| Comment(0) | TrackBack(0) | Swift | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。