25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

型のキャスト (as, as?, as!) について

Last updated at Posted at 2018-07-08

#型のキャスト
はじめに型のキャストとは、演算子asを用いて変数や定数の値をより具体的な型として扱う操作です。ここではアップキャストとダウンキャストについて説明します。

#アップキャスト
アップキャストとは、クラスの継承やプロトコルの準拠などの階層関係がある型どうしにおいて、
上位の型として扱う操作です。


let str = "abc"   
let any = str as Any      //String型をAny型にアップキャスト

アップキャストはコンパイル可能な場合、常にキャストに成功します。
そのため、上記のような定数(および変数)の宣言時にas演算子によってアップキャストを行う場合、
キャスト先の型として推論可能なため、型アノテーションが省略できます。

#ダウンキャスト
ダウンキャストとは、クラスの継承やプロトコルの準拠などの階層関係がある型どうしにおいて、
下位の型として扱う操作です。
ダウンキャストはアップキャストと異なり、コンパイル可能な場合でもキャスト実行が失敗することがあります。
そのため、ダウンキャストの方法としてas!as?が用意されています。

#as!
as!はダウンキャストの際、強制的に右辺の型にキャストをします(強制キャスト)。


let any: Any = "abc"
let str = any as! String   //String型"abc"
let num = any as! Int      //Int型にキャスト失敗(実行時エラー)

上記ではAny"abc"String"abc"にダウンキャストは成功しているものの、Int型へのダウンキャストは失敗し実行時エラーとなります。

#as?
as?はダウンキャストが成功するか分からない場合に使用します。成功時はOptional型となり、キャスト失敗時はnilとなります。


let any: Any = "abc"
let str = any as? String   //Optional("abc")
let num = any as? Int      //nil

上記では Any"abc"をダウンキャストする際、成功時はOptional("abc")となり失敗時はnilとなります。

#まとめ
アップキャストはコンパイル時にエラーが発見できますが、ダウンキャストはコンパイル成功時も実行時エラーとなる可能性があるため、注意する必要があります。
特にas!は値の型が保証されている場合は便利ですが、迷った場合はas?を用いることが良いかと思います。

25
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?