Swiftの「関連値を持つenum」は、各ケースが個別の値(異なる型)を保持できることを可能にします。このようなenumは実質的に代数的データ型(Algebraic Data Type)となり、異なる追加データを持つ有限の選択肢を表現するのに最適です。
この構造は以下のような場合に使用します:
コード例:
enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("データを受け取りました: \(data)") case .failure(let error): print("エラー: \(error.localizedDescription)") } }
enumの中にenumを作成することはできますか(ネストされたenum)?それはどのように役立つのでしょうか?
回答: はい、Swiftはネストされた列挙体をサポートしています。これは、ネストされた状態をモデル化し、スコープを提供するのに便利です。例えば:
enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }
ストーリー
プロジェクトでは関連値を持つenumを通じて複雑なリクエスト状態モデルが実装されましたが、新しいケースをswitchに追加する際にdefault処理が実装されませんでした。これにより、ランタイムで検出が難しいサイレントエラーが発生しました。
ストーリー
開発者は関連値を持つenumを直接JSONにシリアル化しようとしました。各ケースのためにCodableを手動でサポートしない限り、アプリケーションはデコード時にデータを失い、サーバとの同期時に重大なバグを引き起こしました。
ストーリー
ネットワーク層では、エラーを伝達する際にenumではなくクラスのみが使用されました。その結果、エラーのリストが急速に増加し、重複する型が発生し、enumの解決策に比べてサポートが複雑になりました。enumを使用すればエラーのリストはtype-safeで中央集権化されるでしょう。