Swiftキャスト

Swfitではキャストする場合に「!」「?」を使う場合があります。

as

・型変換・キャストが必ず成功すると保証されたときに使用
・アップキャスト
リテラルの型を指定

class Animal {}
class Dog: Animal {}
let dog = Dog() // dogはインスタンス
let animal = dog as Animal // dogをスーパークラスのAnimalのインスタンスにアップキャスト
let floatValue = 1 as Float // 型指定

as!

・強制的にダウンキャスト
・ダウンキャストが成功することがわかっている場合
・ダウンキャストが失敗するとランタイムエラーになる

let animal1: Animal = Dog()
let dog = animal1 as! Dog // 問題なし
let animal2 = Animal()
let dog2 = animal2 as! Dog // 

as?

・ダウンキャストが成功するかわからないときに使用
・戻り値はオプショナル型
・失敗した場合は、Optional.None

let animal1: Animal = Dog()
let dog = animal1 as? Dog // dogの型はOptional<Dog>

let animal2 = Animal()
let dog2 = animal as? Dog // エラーは起こらない。dog2の中身は.None