Swift プログラミング
基本構文
Swift 言語で変数に格納されているクラスインスタンスの型を判定する方法です。
Swift でインスタンスのクラス型を判定する
Objective-C言語 ではisKindOfClass:メソッド やisMemberOfClass:メソッド を使って変数に格納されているインスタンスのクラス型を判定できるようになっていますが、同様のことをSwift言語 でも行えるようになっています。
あるクラスを継承しているかを判定する
if
文を使って判定する方法
ある変数のインスタンスが目的のクラスから継承されているかを知りたい場合、Objective-C言語
ではisKindOfClass:メソッド
で判定できるようになっていますが、Swift言語
の場合はas?
演算子とlet
キーワードを使って判定します。
if let sub1 = object1 as? SubClass {
}
このようにすることで、変数object1
がSubClassクラス
を継承するかそれ自身のインスタンスだった場合にif
文が真として判定されます。
このとき、条件文のlet
で定義した変数には、インスタンスがSubClass
型の値として格納され、if
文の中ですぐに使用できるようになっています。
let
の代わりにvar
を使うこともできます。通常の変数定義と同様で、この変数自体に再代入できるかどうかが違ってきます。
nil 許容型を使って判定する方法
先ほどのif
の条件として指定した部分は、条件文の外でも使うことができます。
let sub1 = object1 as? SubClass
このようにすると、変数object1
がSubClassクラス
を継承しているインスタンスだった場合に、それを受ける変数sub1
に、SubClass?
型の値として設定されます。
このとき、変数object1
がSubClassクラス
を継承していない場合はnil
が、変数sub1
に設定されます。
Objective-C言語
のように値がnil
だった場合はその後のメソッドの呼び出しを無視したいような場合は、こちらの書き方を使うとOptional Chaining
が利用できて便利かもしれません。
is演算子 を使って判定する方法
単純に、あるインスタンスが目的のクラスを継承しているかを判定したい場合には、is演算子 を使って判定できます。
if sub1 is SubClass {
}
このようにすることで、変数sub1
がSubClassクラス
を継承しているかSubClassクラス
そのものの場合に、条件判定がtrue
になります。
特定のクラスであるかを判定する
継承関係は考慮しないで、ある変数のインスタンスが目的のクラス型そのものであるかを知りたい場合、Objective-C言語
ではisMemberOfClass:メソッド
で判定しますが、Swift言語
ではClass.Type
を取得して、それを===演算子
で比較します。
インスタンスとクラスとで、それぞれ自身のクラス型 (Class.Type) の取得方法が違ってきます。
対象 | クラス型の取得方法 |
---|---|
インスタンス | instance.dynamicType |
クラス | Class.self |
これらを使うとクラス型が取得できるので、あとは次のようにして判定できます。
if sub1.dynamicType === SubClass.self {
}
完全に一致することが条件なので、たとえば変数sub1 が、SubClassクラス を継承したSubSubClassクラス だったとしても不一致として判定されます。