SNOOZE LOG

iOS中心のプログラミング関連技術メモ

Swift3 / Swift2 「型の比較」「型名の取得」まとめメモ

Swiftのバージョン違い情報など、うまく検索に出なかったりしたのでまとめておきます。

型の取得

クラスから型(Class)を取得

// Swift2以前、および Swift3(どちらも同じ)
SomeClass.self


インスタンスから型(Class)を取得

// Swift2以前
someInstance.dynamicType

// Swift3
type(of: someInstance)


型名の取得#

Stringのイニシャライザに取得したClassを引数として与えます。

// Swift2以前
let className = String(someInstance.dynamicType)
または
let className = NSStringFromClass(someInstance.dynamicType)

// Swift3
let className = String(reflecting: type(of: someInstance))
または
let className = NSStringFromClass(type(of: someInstance))


型の比較

ベースクラス一致

// Swift2以前、および Swift3(どちらも同じ)
if someInstance is HogeClass {
    // someInstanceがHogeClassを継承しているインスタンスだとtrue
}


サブクラスまで完全一致

// Swift2.x以前
if someInstance.dynamicType === SubClass.self {
    // someInstanceがSubClassと同じ型だとtrue
}

// Swift3
if type(of: someInstance) === SubClass.self { 
    // someInstanceがSubClassと同じ型だとtrue
}


上記では、===を使用していますが、==でも実行したところ問題が無さそうです。
参考: How to check two instances are the same class/type in swift - Stack Overflow

<補足>
===、!==(トリプルイコール)演算子
a === b でaとbが同じオブジェクト(インスタンスであることを確認できる。

==、!=(ダブルイコール)演算子
a==b が同じであることを確認できる。
is演算子
型チェック(目的のクラスを継承しているか)