nil、空文字列、数値の0は異なる状態です。すべてのオプショナルをデフォルト値にすると、未入力と明示的な0の違いが消える場合があります。欠落を正常な既定値として扱うか、別状態として残すかを先に決めます。
仕組みと設計の判断基準
Optionalはsomeとnoneで存在を表します。局所的な条件処理にはif let、早期終了にはguard let、適切な既定値がある場合には??を使います。オプショナルチェイニングは途中が欠けるとnilになり、強制アンラップはnilで停止するため想定内の入力失敗には不適切です。 一次資料
再現コード
quantityは未入力、不正入力、有効数量を別々のenumで返します。nil、空文字列、cat、-1、0、7の六件を検証します。??が既定値関数を呼ぶ回数と、空文字列と未入力のcountも別々に確認します。
この独立したサンプルは2026-10-23に、arm64 macOS向けのApple Swift 6.4をSwift 6言語モードで実行しました。ネットワーク接続や追加パッケージは不要です。
ダウンロード先のフォルダーで実行してください。検証条件を満たさない場合はpreconditionで停止します。検証が削除されるため、-Ouncheckedは使用しないでください。
swift -swift-version 6 swift-optional-enum-unwrapping.swift
enum Quantity: Equatable { case missing, invalid, value(Int) }
func quantity(_ raw: String?) -> Quantity {
guard let raw else { return .missing }
guard let value = Int(raw), value >= 0 else { return .invalid }
return .value(value)
}
let cases: [(String?, Quantity)] = [
(nil, .missing), ("", .invalid), ("cat", .invalid),
("-1", .invalid), ("0", .value(0)), ("7", .value(7))
]
for (raw, expected) in cases { precondition(quantity(raw) == expected) }
var fallbackCalls = 0
@MainActor func fallback() -> Int { fallbackCalls += 1; return 99 }
let present: Int? = 0
let absent: Int? = nil
precondition((present ?? fallback()) == 0 && fallbackCalls == 0)
precondition((absent ?? fallback()) == 99 && fallbackCalls == 1)
let empty: String? = ""
let missing: String? = nil
precondition(empty?.count == 0 && missing?.count == nil)
print("inputs=6 missing=1 invalid=3 valid=2 fallback-calls=1 empty-count=0 missing-count=nil")
実行結果と読み取り方
inputs=6 missing=1 invalid=3 valid=2 fallback-calls=1 empty-count=0 missing-count=nil
未入力1件、不正3件、有効2件を区別できました。some(0)では既定値関数を呼ばず、noneで一度だけ呼びます。空文字列のcountは0ですが、未入力へのチェイニングはnilです。0のような値を不在と扱わないことが重要です。
適用範囲と注意点
これは負数を拒否する数量検証であり、あらゆる数値入力方針を扱いません。空白、小数、地域別表記、上限は要件に応じて追加します。String!も必要な文脈で暗黙にアンラップされ得る宣言であり、使用するたび必ず強制アンラップされるわけではありません。
次に確認すること
未入力と不正入力に異なる案内が必要か決め、サーバーの契約と合わせます。失敗理由を細かく伝える必要があれば、既定値で隠さずthrowsやResultで情報を保つ方法を検討してください。
出典と確認基準
- The Swift Programming Language: The BasicsSwift.org · 公式ドキュメント · 確認日 2026年10月23日根拠: 実装の契約と説明の根拠です。出力は、この記事に掲載した実験で別途確認しました。

