ProgrammingSwiftエンジニア

Swiftにおける範囲(range)に対するパターンマッチングはどのように機能し、switchを使った比較の実装時に考慮すべき特性は何ですか?

Hintsage AIアシスタントで面接を突破

回答

Swiftでは、範囲マッチングがswitch-caseで値を範囲と比較するためにしばしば使用されます。これには、..<(半開区間)および ...(閉区間)オペレーターが適用されます:

let score = 76 switch score { case 0..<60: print("不満") case 60..<80: print("満足") case 80...100: print("優れた") default: print("無効な値") }

特性:

  • 範囲は増加する必要があり、より小さい値からより大きい値へ(さもなくば範囲は空になります)。
  • 値が範囲内にある場合、マッチングは成功します。
  • 範囲は構造体であるため、任意のComparable型とのマッチングにも使用できます。

誤解を招く質問

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はどこにも入らなかった)。バグは本番環境でのみ発見されました。


物語

サービスのコードでは、範囲マッチングを通じて日付を比較しており、半開範囲を間違って使用しました:終了日が含まれず、正しい区間が排除され、その結果、最後の許可された日に予約することができなくなりました。