请考虑以下代码:
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
显然,匹配子类元组的模式不起作用。这是一个错误还是一个功能?如果是后者,那么知道原因会很有趣。
答案 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")
}
中使用l
和r
:
case