Swiftでは、範囲マッチングがswitch-caseで値を範囲と比較するためにしばしば使用されます。これには、..<(半開区間)および ...(閉区間)オペレーターが適用されます:
let score = 76 switch score { case 0..<60: print("不満") case 60..<80: print("満足") case 80...100: print("優れた") default: print("無効な値") }
特性:
switchで上限値を含まない範囲(例えば、0..<5)を使用し、変数の値が5の場合はどうなりますか?
多くの人はそのようなcaseが動作すると答えますが、それは誤りです:..<オペレーターは上限を含みません。例:
let value = 5 switch value { case 0..<5: print("0-4") case 5: print("五") default: print("他") } // 出力: "五"
物語
開発者は、右境界が最大値を超える閉じた範囲を使用してユーザーのスコアを範囲によって表示することを実装しました。これにより、いくつかの値が同時に二つの区間に入ってしまい、ロジックが正しく機能しませんでした。
物語
アプリケーションでは、switch-caseと範囲が使われ、一つの値がオペレーターの誤用によりどの範囲にも入らないということがありました(例えば、0...10および11...20 — 値10.5はどこにも入らなかった)。バグは本番環境でのみ発見されました。
物語
サービスのコードでは、範囲マッチングを通じて日付を比較しており、半開範囲を間違って使用しました:終了日が含まれず、正しい区間が排除され、その結果、最後の許可された日に予約することができなくなりました。