Programmingミドル iOS 開発者

Swiftにおけるタプルを使用したパターンマッチングはどのように機能し、タプルを比較する際に注意すべき点は何ですか?

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

回答

Swiftのタプルに対するパターンマッチングは、値を便利に比較およびアンパックすることを可能にします。switch文では、パターンの中でタプルを直接分解することができます:

let point = (x: 0, y: 2) switch point { case (0, 0): print("原点") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("xはyと等しい") default: print("別の点") }

注意点:

  • 要素の数と順序はタプルと一致している必要があります。
  • Possible bindingとguard文は通常の変数と同様に機能します。
  • Exhaustiveness checkは、完全な範囲が定義された値のタプルに対してのみ可能です。

トリックな質問

switch-caseで、異なる型のcaseパターン、例えばcase (let a, let b):と比較して、(String, Int)型のタプルを使用することは可能ですか?

多くの人は可能だと答えますが、重要な点はパターン内の変数の型はタプルの型と厳密に一致している必要があります。

let pair = ("abc", 5) switch pair { case (let text, let number): print("文字列: \(text), 数: \(number)") // OK case (let x, let y) where x == y: print("エラー") // エラー: 二項演算子 '==' は 'String' と 'Int' 型のオペランドに適用できません default: break }

型が一致しない場合、コンパイラはコンパイル時にエラーを生成します。

テーマの詳細が不十分なための実際のエラーの例


物語

あるプロジェクトでは、サーバーの応答をタプルとしてswitch-caseで解析しようとしましたが、nilの可能な値を考慮していませんでした。その結果、どのcaseにも一致せずdefaultが発動し、別のロジックを想定していたにもかかわらず問題が発生しました。


物語

型の不一致:タプルのハンドラ関数が(Int, String)を受け取ったのに、(String, Int)としてアンパックしようとしました。その結果、コンパイル時にクラッシュし、原因を探すために時間を無駄にしました。


物語

負の値のケースを考慮せずに結果のタプルをアンパックするためにguardを使用しましたが、処理は正の数のみに限定されていました。その結果、有効なケースの一部が無視され、ビジネスロジックに問題が生じました。