2014年6月4日水曜日

Swift言語の入門 (4) パターンマッチ編

Swiftに導入されたモダンな機能の一つに、パターンマッチがあります。これは、switch文などのなかで、変数の状態によって場合分けを行うために多く用いられます。
if文をふんだんに使えばもちろん同等な機能は実現できはするのですが、パターンマッチを使うことでよりシンプルで明確に記述することができるようになります。

1.ワイルドカードパターン

  • for _ in 1...3 {
  • // Do something three times.
  • }

たとえば、for文で何らかの処理を3回行いたいけれども、現在が何回目かどうかを気にする必要がないような場合には上記のコードを書きます。1...3は[1, 2, 3]を表し、中の点が3つなので3も含むことに注意してください。

2.値束縛パターン

  • let point = (3, 2)
  • switch point {
  • // Bind x and y to the elements of point.
  • case let (x, y):
  • println("The point is at (\(x), \(y)).")
  • }

switch分のcaseが一つしかありませんが、その中でpointの3と2をそれぞれxとyに割り当てています。

3.タプルパターン

  • let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
  • for (x, y) in points {
  • /* ... */
  • }

for...inの中で、それぞれの要素に対してパターンマッチを適用する際に利用します。
タプルの要素は全て変数である必要があります。


  • let point = (1, 2)
  • switch point {
  • case (0, 0):
  • println("(0, 0) is at the origin.")
  • case (-2...2, -2...2):
  • println("(\(point.0), \(point.1)) is near the origin.")
  • default:
  • println("The point is at (\(point.0), \(point.1)).")
  • }

数値の範囲等の条件を指定してパターンマッチを行います。switch文の中でのみ利用可能です。

  • // Overload the ~= operator to match a string with an integer
  • func ~=(pattern: String, value: Int) -> Bool {
  • return pattern == "\(value)"
  • }
  • switch point {
  • case ("0", "0"):
  • println("(0, 0) is at the origin.")
  • case ("-2...2", "-2...2"):
  • println("(\(point.0), \(point.1)) is near the origin.")
  • default:
  • println("The point is at (\(point.0), \(point.1)).")
  • }

式のマッチングオペレータは ~= で表され、これをオーバーロードすることによって、独自のマッチング機構を作り出すことができます。


総括
  • Swiftではswitch文の出番がものすごくおおい
  • パターンマッチを使って型を分解しよう
  • 式のマッチングオペレータはオーバーロードできる
Swift関連記事