Swiftだけではないですが、SwiftにはOptional型という特徴的な型があります。
今回はそんなOptional型についてお話しできたらと思います!
Optional型とは
Optional型
とは通常の値とは別にnullをとれる型です。
他の言語ではString型やInt型といった通常の型にnullという値が入ると思いますが、Swiftでは通常の型にはNULLを入れることができず、もしnullを扱いたい場合はOptional型
を使わないといけません。
SwiftのOptional型はnullの場合に文法的にエラーを返してくれるので、文法通りに書けばバグをある程度回避できるメリットがあります。
Optional型を使おう
では実際にどのようにOptional型を使うかというところを見ていきます。
まず、Optional型は?
や!
を使います。
宣言時には下記のようにします。
var a: Int?
このように、Intの後ろに?
をつけるとInt型ではなく、Optional型になります。
また、Int型は初期化しないとコンパイルエラーになりますが、Optional型ではコンパイルエラーにはなりません
let a: Int? //宣言時に初期値を定義しなければ自動的にnilが入る var b: Int? = 2 //nilじゃない値も入れることが出来る b = nil //nilを代入することも出来る var c: String //nilを入れれないのでエラー
?
はnullが入る可能性があるという意味なので、Optional型ではnullが許容されています。
ちなみに、Optional型の値を見てみると、下記のようになります。
let a: Int = 1 print(a) // 1 let b: Int? = 2 print(b) // Optional(2)
上記の場合だと、Optional型はInt型ではないので、下記のように計算はできません。
let a: Int = 1 let b: Int? = 2 let c = a + b //コンパイルエラー
では、計算したい場合はどうすればいいでしょうか?
そのときに使うのが!
です。
let a: Int? = 1 print(a) // Optional(1) print(a!) // 1
!
を使うことをアンラップと言います。このアンラップをすることで、nullが入らないことが前提と定義できるので、上記の場合はOptional型ではなくInt型として使うことができます。
しかし、アンラップしている値にnullが入ったらクラッシュするため注意が必要になります。
let a: Int? = nil let b = a! //クラッシュ
クラッシュしないためにnullチェックが必要になりますが、Swiftではif-let構文
を使うことが多いです。
let a: Int? = nil if b = a { let d = b! print(d) // nullではない場合に通る } else { print("nil") //aがnullの場合の処理 }
上記のようにaがnullの場合はelseの方を通るのでnullの場合の処理を記載することができるので、nullチェックを行うことができます。
また、下記のように変数を使わない場合は_
(アンダースコアー)で記載することも可能です。
let a: Int? = nil if _ = a { print("nilではない") } else { print("nil") }
Swiftを学び始めたときにん??となる箇所だと思いますが、他の言語と比較することで学びやすくなるかと思います。