継承関係にあるクラス間で変換を行う型キャスト
型キャストとは
型の変換のことです。
今まで見てきた型の変換は、String型をInt型にしたり、小数点型を整数型にしたりと、「型名()」で変換を行なっていました。StringクラスやIntクラスにあらかじめ用意された、限定的に使用される異なる型同士の変換です。
今回お教えする「型キャスト」は基本的に、
継承関係にあるクラス、もしくは同じクラスを親クラスとして持つ子クラス同士の変換のことを言います。
変換時のコードは基本的に、
変換対象 as 変換したい型 と記します。
早速見ていきましょう。
アップキャスト
型キャストにおいて、下位の型から上位の型へ変換する処理を指します。
イメージとしては、小さい器(型)の中身を大きい器(型)へと移す作業です。
(例:犬クラスを継承した盲導犬クラスがある時、盲導犬クラスのインスタンスを犬型に変換する)
器を大きくするだけなので、変換の失敗などは考慮しません。
具体例を見てみましょう。
今回はPlaygroundでも試せるよう、あらゆる型を格納できるAny型を使って簡単な例を示します。
1 2 |
let str: String = "こんにちは" let upCast = str as Any |
String型の定数strを、Any型に変換して定数upcastへ代入しています。
ダウンキャスト
型キャストにおいて、上位の型から下位の型へ変換する処理を指します。アップキャストの逆です。
イメージとしては、大きい器(型)の中身を小さい器(型)へと移す作業です。
器が小さくなるので、中身によっては変換が失敗する可能性があります。その点を考慮しなければいけません。
変換失敗時の挙動は、as? と as! を使い分けることで考慮します。
具体例として、Any型(中身は文字列)を、String型とInt型に変換してみましょう。
Int型にダウンキャストした時に、失敗となるのでそれぞれ挙動を試してみてください。
as?・・・変換後はオプショナル型に
1 2 3 |
let str: Any = "こんにちは" as Any let downCastStr = str as? String let downCastInt = str as? Int //nilが代入される |
asの後ろに?をつけると、変換後の値をオプショナル型にしてくれます。
失敗時には、オプショナル型の定数の中にnilが入ります。
as! ・・・変換後は非オプショナル型に
1 2 3 |
let str: Any = "こんにちは" as Any let downCastStr = str as! String let downCastInt = str as! Int //実行時エラー |
asの後ろに!をつけると、変換後の値はそのままの状態(ラップされない)で返されます。
失敗時には、エラーが発生します。(アプリが落ちます。)
?や!の記号は、前の節の03 nilとOptional型でも似たような意味で使われていましたね。
(型の後ろに?をつけるとラップされ、!をつけるとアンラップされる)
もし用語の意味などでわからないことがあれば戻って確認してみてください。
これらの知識は、クラスを使ってアプリを作成する後の章で出てきます。
このコードを見かけたら、またここへ戻ってきて意味を確認してみてください。