Swift プログラミング

基本構文

Swift 言語で変数に格納されているクラスインスタンスの型を判定する方法です。

Swift でインスタンスのクラス型を判定する

Objective-C言語 ではisKindOfClass:メソッドisMemberOfClass:メソッド を使って変数に格納されているインスタンスのクラス型を判定できるようになっていますが、同様のことをSwift言語 でも行えるようになっています。

あるクラスを継承しているかを判定する

if 文を使って判定する方法

ある変数のインスタンスが目的のクラスから継承されているかを知りたい場合、Objective-C言語 ではisKindOfClass:メソッド で判定できるようになっていますが、Swift言語 の場合はas? 演算子とlet キーワードを使って判定します。

if let sub1 = object1 as? SubClass {

}

このようにすることで、変数object1SubClassクラス を継承するかそれ自身のインスタンスだった場合にif 文が真として判定されます。

このとき、条件文のlet で定義した変数には、インスタンスがSubClass 型の値として格納され、if 文の中ですぐに使用できるようになっています。

let の代わりにvar を使うこともできます。通常の変数定義と同様で、この変数自体に再代入できるかどうかが違ってきます。

nil 許容型を使って判定する方法

先ほどのif の条件として指定した部分は、条件文の外でも使うことができます。

let sub1 = object1 as? SubClass

このようにすると、変数object1SubClassクラス を継承しているインスタンスだった場合に、それを受ける変数sub1 に、SubClass? 型の値として設定されます。

このとき、変数object1SubClassクラス を継承していない場合はnil が、変数sub1 に設定されます。

Objective-C言語 のように値がnil だった場合はその後のメソッドの呼び出しを無視したいような場合は、こちらの書き方を使うとOptional Chaining が利用できて便利かもしれません。

is演算子 を使って判定する方法

単純に、あるインスタンスが目的のクラスを継承しているかを判定したい場合には、is演算子 を使って判定できます。

if sub1 is SubClass {

}

このようにすることで、変数sub1SubClassクラス を継承しているかSubClassクラス そのものの場合に、条件判定がtrue になります。

特定のクラスであるかを判定する

継承関係は考慮しないで、ある変数のインスタンスが目的のクラス型そのものであるかを知りたい場合、Objective-C言語 ではisMemberOfClass:メソッド で判定しますが、Swift言語 ではClass.Type を取得して、それを===演算子 で比較します。

インスタンスとクラスとで、それぞれ自身のクラス型 (Class.Type) の取得方法が違ってきます。

対象 クラス型の取得方法
インスタンス instance.dynamicType
クラス Class.self

これらを使うとクラス型が取得できるので、あとは次のようにして判定できます。

if sub1.dynamicType === SubClass.self {

}

完全に一致することが条件なので、たとえば変数sub1 が、SubClassクラス を継承したSubSubClassクラス だったとしても不一致として判定されます。