2017-01-18 5 views
1

のタプルと一致することはできません、次のコードを考えてみましょう:遊び場でこれを実行するは、パターンのサブタイプ

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()) 

は、次の出力を生成します。

l is A 
failed to match tuple 

どうやらサブタイプのタプルをパターンマッチングが動作しません。これはバグか機能ですか?後者の場合は、理由を知ることは面白いでしょう。

+0

関連:[Swiftの "Tuple" upcasting](http://stackoverflow.com/questions/31270507/tuple-upcasting-in-swift) – Hamish

答えて

3

更新:予想通りスウィフト3.1では、Xcodeの8.3ベータ版で利用できるが、あなたのコードは、現在動作します。)

これはバグであり、SR-1423によって追跡されます。しかし、このレポートによれば、問題はSwiftリポジトリのマスターブランチで修正されているので、Swift 3.1が来たら(expected release dateは「2017年の春」)、すべてがうまくいくはずです。

しかし、それまでは、簡単な解決策は、個々のタプルの各要素の型をチェックするだけです:

switch (l, r) { 
case (is A, is A): 
    print("(l, r) is (A, A)") 
default: 
    print("failed to match tuple") 
} 

それともcaselrを使用する必要がある場合:

switch (l, r) { 
case let (l as A, r as A): 
    print("(\(l), \(r)) is (A, A)") 
default: 
    print("failed to match tuple") 
} 
関連する問題