くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

Optional型について

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を学び始めたときにん??となる箇所だと思いますが、他の言語と比較することで学びやすくなるかと思います。