🫠

swift オプショナル型?強制アンラップ!についてとその注意点のメモ

2024/05/15に公開

※更新が必要※強制アンラップはあんま使わないらしい?
オプショナル型とは、nilの状態(値がない状態)を保持することができる変数です。

オプショナル型の変数や定数の宣言

var optionalInt:    Int?Int型のオプショナル
var optionalString: String?String型のオプショナル
var optionalDobule: Double?Double型のオプショナル

それぞれ、定義した形に加えて、nilを保持することができる。

オプショナル型の関数の返り値の宣言

var hoge: Int? = nil
func optionalFunction() -> Int? {
  return hoge
出力
nil

関数の戻り値の型にオプショナルをつけることで、戻り値がnilになることを許容できます。

オプショナル型の初期化

var optionalValue: Int? = 42
var optionalValue: String? = nil

オプショナル型の変数や定数を初期化する場合、値が存在する場合はその値を代入し、nilを保持する場合はnilを代入することができます。

僕的に覚えておきたいことは
型の後ろに?がついていたら、nilを許容するオプショナル型なんだなと覚えておきたいです。

強制アンラップ!とは

Swiftでは、オプショナル型をアンラップする際に!を使用する。
オプショナルをアンラップすることで、その中の実際の値にアクセスすることができる。
下記例のコードになります↓

//オプショナルなHello,Swift!という文字
let optionalString: String? = "Hello,Swift!"
//強制アンラップを使用してオプショナルに値にアクセス
let unwrappedString: String = optionalString!
print(unwrappedString)//Hello,Swift!

強制アンラップの注意点
⚪︎アンラップしようとしているオプショナルがnilであった場合、ランタイムエラーが発生してアプリがクラッシュします。

let optionalString: String? = "nil"
//nilを強制アンラップしようとするとクラッシュする
let unwrappedString: String = optionalString! // ここでクラッシュ
print(unwrappedString)

このようなリスクがあるので、強制アンラップの代わりに下記のような方法を使用する

オプショナルバインディング※guardを使うことがほぼのよう

if letやguard letを使用して、オプショナルがnilでないことを確認してから”安全に”値にアクセスする。

if letを使用したVer

let optionalString: String? = "Hello,Swift!"

if let unwrappedString = optionalString {
   print(unwrappedString)//"Hello,Swift"
} else {
   print("オプショナルはnilですね〜")

ifで条件分岐をしています、optionalStringがnilでない場合は、unwrappedStringを出力nilの場合はオプショナルはnilですねと出力される

guard letを使用したVer

let optionalString: String? = "Hello, Swift"

func printUnwrappedString(optionalString: String?) {
    guard let unwrappedString = optionalString else {
        print("オプショナルはnilですね〜")
        return
    }
    print(unwrappedString) // "Hello, Swift!"
}

printUnwrappedString(optionalString: optionalString)

guard let文を使って、optionalStringがnilでないか確認をしています、nilであればエラーメッセージを出力し、関数を終了します。※早期リターンというやつですかね
nilでない場合、アンラップされた値(unwrappedString)が出力されます。

オプショナルチュイニングを使う形

先に書いてしまったのでこちらを見る↓
https://zenn.dev/articles/aea8a098d7dcb7/edit

僕的に覚えておきたいこと

強制アンラップ リスク高い
・オプショナルに値が必ず存在すると確信している場合に使用する

オプショナルバインディング if let と guard letがある guardが安定
・オプショナルに値が存在するか確認し、値が存在する場合にアンラップして使用したい場合
・値が存在しない場合の処理を明示的に書きたい場合

オプショナルチュイニング アクセスしたい変数にオプショナルつける (hoge?.foooo())
・ネストされたオプショナルプロパティやメソッドにアクセスする場合
・値が存在しない場合に処理をスキップしてnilを返すようにしたい場合

Discussion