【Swift入門】as, as!, as?を使ってアップキャスト, ダウンキャストを行う

2021年4月7日

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が出力されます。