実行環境 Xcode version8.2
Swiftでインスタンスをキャストする場合 as を使います。
as には下記の三つの書式があり、それぞれを使い分ける必要があります。
as | キャストの成功が保証されているアップキャスト、またはリテラルの確定(10 as Double) |
as! | ダウンキャスト時にエラーが起こりそうな場合 |
as? | nilになる可能性がある場合 |
それでは、それぞれの使い方をコードで紹介します。
Manクラスを継承したSuperManクラスと同じくManクラスを継承したUltraManクラスがあります。
46行目のManクラス型変数manは暗黙的アップキャストが行われます。
47行目で変数manをSuperMan型にキャストするためasを使いますがエラーとなります。理由は上記にもあるようにキャストの成功が保証されていないからです。(変数manのインスタンスがSuperMan型だとは限らないため)よってダウンキャスト時はas!を使います。
48行目で変数manをSuperMan型に強制ダウンキャストしています。今回は46行目と同様にインスタンスがSuperMan型だったのでダウンキャストが成功します。
これは場合によってキャストに失敗するかもしれないということ(変数manに格納されたインスタンスがSuperMan型以外の可能性)を視覚的に取ることが出来ます。
49行目は強制ダウンキャストですが変数manに格納されている元のインスタンスがSuperMan型なのでキャストが出来ずエラーとなります。
50行目は49行目と同じく無関係なクラスへのキャストですがエラーとはならずnilが戻ります。as?を使いキャストした場合失敗するとエラーではなく戻り値がnilとなるためです。
最後に53行目です。これは通常のアップキャストなのでasでキャストが可能となります。