1.) スーパークラス オブジェクトをサブクラス タイプに変換できます。
2.) SubClass タイプのオブジェクトを SuperClass に変換することはできません。
これが継承の一般的なルールです。
同じルールがプロトコルの採用にも適用されます。
たとえば、3 つのクラスがあるとします。クラスA、B、C。
Class A {
}
クラス B は A のサブクラスです。
Class B : A {
}
クラス C は A のサブクラスです。
Class C : A {
}
つまり、A はクラス B とクラス c のスーパークラスであると言えます。
以下のようなオブジェクトがあります。
var objA = A()
var objB = B()
var objC = C()
この場合、objA をクラス B または C の型に変換できます。
let objB1 = objA as! B //success
let objC1 = objA as! C //success
ただし、objB または objC をクラス A の型に手動で変換することはできません。
let objA1 : A = objB as! A //will not allowed
クラス B または C 型のオブジェクトをキャストせずにクラス A 型に格納できます。すなわち
let objA2 : A = objB; // objB is type of class B.
let objA3 : A = objC; // objC is type of class C.
その後、必要に応じて objA2 をクラス B の型にキャストできます。
let objB3 = objA2 as! B
AnyObject は Swift のプロトコルです。
すべてのクラスが暗黙的に準拠するプロトコル。
@objc protocol AnyObject
このプロトコルは暗黙的に実装する必要はありません。
クラスA、B、CもプロトコルAnyObjectを採用し、
そのため、A、B、または C のオブジェクトを AnyObject 型に格納できます。
上記のステートメントのように:: let objA2 : A = objB; // objB はクラス B の型です。
let anyObj1 : AnyObject = objA
let anyObj2 : AnyObject = objB
let anyObj3 : AnyObject = objC
AnyObject 型に手動でキャストすることはできませんでした。上記のように直接保存できます。
その後、変換できます。
anyObj1 からタイプ A
anyObj2 からタイプ B
anyObj3 から C 型へ