Swift & Objective-C

Swift Optional:nil・空文字列・0を区別する

六つの入力で欠落と不正を区別し、nil結合演算子のデフォルト処理が実行される条件を確かめます。0を値の不在と混同しません。

読了 3 分
Swift Optional:nil・空文字列・0を区別するのカバー画像

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言語モードで実行しました。ネットワーク接続や追加パッケージは不要です。

Swiftファイル全体をダウンロード

ダウンロード先のフォルダーで実行してください。検証条件を満たさない場合は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日根拠: 実装の契約と説明の根拠です。出力は、この記事に掲載した実験で別途確認しました。