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


Swiftの勉強をしていて、asが出て来ることが多いので、自分なりに調べてまとめてみました。

参考記事
https://fukatsu.tech/swift-cast
https://qiita.com/entry909/items/3c4c9a20bce0c903dc39
http://blog.andgenie.jp/articles/803

キャストについて

キャストとは、asという演算子を用いて変数や定数を具体的な型にはめ込むことです。

asについて

asは、演算子の一種で2種類の変換を実行することができます。

  1. 保証変換
  2. 強制変換

保証変換

保証変換とは、別の型に変換するときに、コンパイラ可能な場合キャストの成功が保証されるような変換です。
例えば、アップキャストというのがあって、クラスの継承やプロトコルの準拠などの階層関係がある型同士においてキャストを行うものです。

let str = "アイウエオ"
let any = str as Any

強制変換

強制変換とは、変換するときにコンパイラで安全性が保証できないので実行時にエラーを引き起こす可能性があるキャストのことです。この強制変換では、ダウンキャストというものがあります。

ダウンキャストとは

ダウンキャストとは、as!、as?のに種類があって、as!は強制的にコンパイラの安全性を無視してキャストを行います。

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

as?は、キャスト自体が成功するかわからない時に使います。
成功時はOptional型になり、失敗時はnil型になります。

let any: Any = "アイウエオ"
let str = any as? String   //Optional("アイウエオ")
let num = any as? Int      //nil