无法模式匹配子类型元组

时间:2017-01-18 15:42:35

标签: swift pattern-matching

请考虑以下代码:

protocol P {}

struct A: P {}


func match(_ l: P, _ r: P) {
  switch l {
    case is A:
      print("l is A")

    default:
      print("failed to match single value")
  }

  switch (l, r) {
    case is (A, A):
      print("(l, r) is (A, A)")

    case (_, _) as (A, A):
      print("(l, r) is (A, A)")

    default:
      print("failed to match tuple")
  }
}

match(A(), A())

在playground中运行它会产生以下输出:

l is A
failed to match tuple

显然,匹配子类元组的模式不起作用。这是一个错误还是一个功能?如果是后者,那么知道原因会很有趣。

1 个答案:

答案 0 :(得分:3)

更新:在Swift 3.1中,Xcode 8.3 beta版提供,您的代码现在可以正常运行了。)

这是一个错误,由SR-1423跟踪。但是,根据该报告,该问题现已在Swift存储库的主分支上修复,因此当Swift 3.1出现时(expected release date是“2017年春天”),一切都应该很好。)

然而,在此之前,一个简单的解决方案就是单独检查元组中每个元素的类型:

db.PAY_TRANSACTION.Include (t=> t.MAS_COUNTRY).Include (t=>t.CMN_INSTITUTE).Include (t=>t.CMN_CURRENCY)

或者如果您需要在switch (l, r) { case (is A, is A): print("(l, r) is (A, A)") default: print("failed to match tuple") } 中使用lr

case