【Swift/SwiftUI】オプショナル型変数のアンラップ方法一覧

本記事では、Swiftにおいてnilを扱うことのできるデータ型であるオプショナル型変数を、アンラップして使用する方法をいくつか紹介していきます。

オプショナル型は、nilが入っている可能性のあるデータ型であり、値が入っているかどうかを検証してから使用しないと予期せぬエラーが発生する可能性があります。

そこで、今回はオプショナル型変数に「!」をつける強制アンラップを除く、if文guard文,nil合体演算子とおいう方法をそれぞれ紹介していきます。

if-let文

オプショナル型変数の値がnilでないことをifで判定し、直後のtrueの処理の中で使用することができるのがif-let文です。

ifの条件式内で定数を宣言し、その定数に対してオプショナル型を代入する構文で、if文やwhile文など一部の構文でしか使用できない特殊な形式です。

var size = Int("350")
if let sizeInt = size {
    print("サイズは\(sizeInt)ml")
}else{
    print("アンラップ失敗")
}

//出力結果:サイズは350ml

上記の例では、変数sizeに文字列をIntにキャストしたオプショナル型の値が入っており、それをif文の条件でsizeIntに代入しています。sizeがnilでなかった場合にはtrueの処理が実行され、nilの場合にはelseの処理が実行されます。

条件式で宣言した定数はtrueの処理の中でアンラップされた値が代入された形で使用可能ですが、if文の外やelseの処理の中では使用できない点は注意が必要です。

また、「let sizeInt = size」の形は条件式の中で入れた場合にはアンラップと代入の役割を果たしますが、普通に代入しただけではアンラップさずオプショナル型のままとなります。

guard文

guard文とは、指定した条件が満たされない場合に実行中の処理から抜け出すための構文として利用されます。

guard文は「guard 条件式 else{}」といった方法で記述し、elseは必ず記述しなくてはいけません。elseの処理の中では、処理を抜けるthrowやreturnなどの記述が必要になります。

var size = Int("350")
guard let sizeInt = size else {
    print("アンラップ失敗")
    fatalError()
}
print("サイズは\(sizeInt)ml")

//実行結果:サイズは350ml

上記の例では、guardの中でsizeInt変数にオプショナル型size変数を代入しており、nilだった場合にはelseの中の処理が実行され、fatalError()でエラーを発生させています。nilでなかった場合には、後継の処理でsizeIntの中身をprintしています。

guard文を使用するメリットは、if let文とは異なりguard文の条件式で代入したアンラップ後の変数・定数をその後の処理の中でも使用することができる、という点です。

特別な理由がない限り、オプショナル型のアンラップにはguard文を使用するのがおすすめです。

nil合体演算子

nil合体型演算子とは、オプショナル型変数の値がnilでなければアンラップした変数の値を、nilだった場合には別の値を使用することができる演算子です。

主にオプショナル型変数の値をアンラップして別の変数や定数に代入する際に使用します。

size = Int("500")
var bottleSize = size ?? 0
print("サイズは\(bottleSize)ml")

上記の例では「??」 を使用することでsizeの中身がnilであるかどうかを判定し、nilでない場合には変数bottleSizeにアンラップしたsizeの値を、nilの場合には0を代入する動きになります。

最後に

本記事では、オプショナル型変数をアンラップして扱う方法について解説してきました。オプショナル型の値を安全にアンラップして使用することにより、アプリケーションのクラッシュなどの予期せぬ事態を防ぐことができます。

他にも構造体の定義と利用方法や関数の宣言と使用方法などについても解説する記事を書いていますのでぜひそちらもご確認ください。