MeWrite Docs

Unexpectedly found nil while unwrapping an Optional value

SwiftでnilのOptional値を強制アンラップした場合に発生

概要

Swiftで値がnilのOptional型を強制アンラップ(!)した場合に発生するランタイムエラーです。アプリのクラッシュ原因として最も一般的なものの1つです。

エラーメッセージ

Fatal error: Unexpectedly found nil while unwrapping an Optional value

原因

  1. 強制アンラップの乱用: nilの可能性がある値に!を使用
  2. IBOutletの接続切れ: Storyboardとの接続が切れている
  3. 初期化前のアクセス: viewDidLoadより前にUIにアクセス

解決策

1. オプショナルバインディング(if let)

1
2
3
4
5
6
7
8
9
// 悪い例
let name = user.name!

// 良い例
if let name = user.name {
    print(name)
} else {
    print("名前がありません")
}

2. guard letで早期リターン

1
2
3
4
5
6
7
8
9
func processUser(_ user: User?) {
    guard let user = user else {
        print("ユーザーがいません")
        return
    }

    // userはnon-optionalとして使用可能
    print(user.name)
}

3. nil合体演算子(??)

1
2
let name = user.name ?? "Unknown"
let age = user.age ?? 0

4. オプショナルチェイニング

1
2
3
4
5
// nilの場合は処理をスキップ
user?.profile?.update()

// 値を取得(Optional<String>が返る)
let city = user?.address?.city

5. IBOutletの確認

1
2
3
4
5
6
7
8
// 悪い例:接続が切れているとクラッシュ
@IBOutlet weak var label: UILabel!

// viewDidLoadで安全にアクセス
override func viewDidLoad() {
    super.viewDidLoad()
    label?.text = "Hello"  // オプショナルチェイニング
}

6. 暗黙的アンラップOptionalを避ける

1
2
3
4
5
6
7
// 悪い例
var data: String!

// 良い例
var data: String?
// または初期値を設定
var data: String = ""

7. Resultやthrowsを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func fetchUser() throws -> User {
    guard let user = repository.find(id) else {
        throw UserError.notFound
    }
    return user
}

do {
    let user = try fetchUser()
} catch {
    print("エラー: \(error)")
}

Swift の他のエラー

最終更新: 2025-12-09