Swiftのswtich構文は拡張されたパターンマッチングをサポートしています。個別のcaseに条件を追加するためにwhereを使用できます。これにより、複雑なビジネスロジックやフィルタリングを実装できるようになります。
例:
enum Person { case student(score: Int) case teacher(specialty: String) } let people = [Person.student(score: 95), Person.teacher(specialty: "Math"), Person.student(score: 65)] for person in people { switch person { case .student(let score) where score > 90: print("優秀な生徒、スコアは\(score)") case .teacher(let specialty): print("科目の教師: \(specialty)") default: print("その他のケース") } }
whereを使用することで可読性が向上し、コードの重複を避けることができますが、複雑すぎる条件は保守性を低下させる可能性があり、関連値を持つパターンマッチングはcaseの順序を明確に管理することが求められます。
質問: 「switch内のwhereを使ったパターンマッチングで、各caseでユニークな名前の変数を呼び出す必要がありますか?」
答え: いいえ、必ずしも必要ではありませんが、混乱を避けるために推奨されます。異なるcaseで同じ名前の変数を使用すると、コンテキストは対応するcaseに制限されますが、同じ名前は可読性とコードの保守性に悪影響を及ぼす可能性があります。
例:
switch value { case .status(let code) where code == 200: print("OK") case .status(let code) where code == 404: print("Not found")
話1
銀行のアプリケーションには、複数のwhere条件を持つステータス分析のセクションがありました。breakを見逃し、caseの順序が不適切だったため、特定のケースが処理されず、ユーザーは操作の完全なステータスを確認できませんでした。エラーは現場でのテスト中に発見されました。
話2
認証システムで開発者は異なるcaseで同じ変数名を使用し、混乱とバグを引き起こしました。2番目のケースで、他のcaseで定義された変数を使用しようとしました。ビルドは正常に動作しましたが、特定のシナリオでは正しくありませんでした。
話3
whereを使用した複雑なパターンマッチングでは、defaultが関連するenumの組み合わせの一部を処理できないことを考慮しなかったため、アプリケーションがpattern matching failedのエラーでクラッシュしました。この問題は、将来的に新しいデータタイプを統合する際に発見されました。