【Swift入門】as, as!, as?を使ってアップキャスト, ダウンキャストを行う
この記事の目次
asとは
asとは型キャストをするためのものです。
型キャストとはインスタンスの型をそのインスタンスのsuperclassまたはsubclassとして扱うことをいいます。
例えば『String』型のインスタンスを
継承元である『Any』型として扱ったり、
逆に『Any』型のインスタンスを
継承先である『Int』型として扱うことができます。
継承先のインスタンスの型を
継承元のクラスとして扱うことを
『アップキャスト』と呼びます。
一方で、継承元のインスタンスの型を
継承先のクラスとして扱うことを
『ダウンキャスト』と呼びます。
『アップキャスト』の場合は
普通に『as』を使ってキャストします。
一方で『ダウンキャスト』の場合は、
『as!』または『as?』を使います。
『as!』と『as?』の説明は後にして、とりあえず普通に『as』を使って、アップキャストをやってみましょう。
asは
変数 as 継承元の型 |
と記述します。
実際に使ってみる
それでは、『as』を使ってアップキャストをやってみましょう。
新しくplaygroundを作って空にしてください。
まずは『Any』型、『String』型、『Int』型の変数をそれぞれ作りましょう。
var any: Any = 1024 var str: String = “String” var int: Int = 128 |
と記述しましょう。
コードについて説明していきます。
まず、
var any: Any = 1024 |
という記述は『Any』型の
『any』という名前の変数を作って、
『1024』を格納しています。
次に
var str: String = “String” |
という記述では『String』型の
『str』という変数を作って、
『String』という文字列を格納しています。
次に
var int: Int = 128 |
という記述は『Int』型の
『int』という名前の変数を作って、
『128』という数値を格納するという内容です。
次に、これらの変数を使って、アップキャストをやってみましょう。
var anyStr = str as Any anySis = any print(anyStr) |
と記述しましょう。
コードについて説明していきます。
まず、
var anyStr = str as Any |
という記述では、String型の変数『str』を
『Any』として扱って
『anyStr』という変数に格納しています。
次に
という記述では『Any』として扱われている『anyStr』に
Any型の『any』を格納しています。
anyには『1024』が格納されているので
『anyStr』には
1024という『数値』が格納されています。
『anyStr』はAny型として扱われているので、数値が入っても問題ありません。
最後に
print(anyStr) |
という記述で『anyStr』の値をコンソールに出力します。
『anyStr』には『1024』が格納されているので、コンソールにはそのように出力されるはずです。
実行してみましょう。
実行ボタンを押してください。
実行すると、予想通りコンソールには『1024』と出力されましたね。
このようにasを使えば、何の問題もなくアップキャストをすることができます。
as!とは
as!とは強制的にダウンキャストするためのものです
アップキャストの場合は、どのような時でも成功します。
一方でダウンキャストの場合は失敗する可能性があります。
例えば、『Any』のインスタンスに『1024』が格納されているとしましょう。
このインスタンスをIntにダウンキャストすることは問題なくできます。
1024という数値はInt型に格納することができるからです。
一方でString型にダウンキャストすることは
できません
1024は数値であって、文字列ではないためです。
このようにダウンキャストは失敗することがあります。
ダウンキャストが失敗する可能性を考慮せずに、強制的にダウンキャストをする場合は『as!』を使います。
そのため、ダウンキャストが成功することが確信できる場合のみ、『as!』を使います。
実際に使ってみる
実際に『as!』を使って、強制的にダウンキャストをしてみましょう。
その前に、前回記述したアップキャストの記述を
コメントアウトしておきましょう。
それでは、やっていきましょう。
print(any as! Int) |
と記述しましょう。
コードについて説明します。
このコードでは『Any』型の
変数『any』を
『as!』を使って、強制的に
『Int』型として扱い、
printで
その中身をコンソールに出力するという内容です。
anyには『1024』という数値が格納されています。
なので『Int』として扱っても、
問題なく実行できます。
この状態で実行すると『1024』とコンソールに出力されるはずです。
実行ボタンを押してください。
実行すると、予想通りコンソールには『1024』と出力されますね。
次は1024という数値が格納されているanyをString型として強制的に扱ったらどうなるのか試してみましょう。
print(any as! String) |
と記述しましょう。
この状態で実行すると、anyに格納されている『1024』という数値は
『String』型には
格納できないため、エラーが出てしまうはずです。
実行してみましょう。
実行ボタンを押してください。
実行すると、予想通りエラーが出てしまいましたね。
このように、『as!』を使えば強制的にダウンキャストすることができます。
実行時にエラーが出てしまうことがあるので、慎重に使いましょう。
as?とは
『as?』とは、ダウンキャストが成功するときはオプショナル型が、失敗するときはnilが出力されるものです。
オプショナルバインディングなどでnilチェックができるので、『as!』を使うよりも安全に使うことができます。
実際に使ってみる
それでは、実際に『as?』を使ってみましょう。
その前に、前回記述した『as!』の記述を
コメントアウトしましょう。
それでは『as?』を使っていきます。
まずはanyを『Int』型として扱ってみましょう。
print(any as? Int) |
と記述しましょう。
anyには
『1024』という数値が格納されているので
『Int』型にダウンキャストすることができます。
なので、『as?』を使えば
オプショナルで包まれた『1024』が出力されるはずです。
この状態で実行してみましょう。
実行ボタンを押してください。
実行してみると、予想通り、オプショナルで包まれた『1024』が出力されましたね。
次に『as?』を使ってanyをString型として扱ってみましょう。
print(any as? String) |
と記述しましょう。
anyには
『1024』という数値が格納されているので、
『String』型として扱うことはできません。
なので『as?』を使えば
『nil』が出力されるはずです。
実行ボタンを押しましょう。
すると、予想通りコンソールには『nil』が出力されます。
このように、『as?』を使えば、ダウンキャストが成功するときはオプショナル型が、失敗するときはnilが出力されます。