2017-01-18 5 views
1

den folgenden Code Betrachten entsprechen:Kann ein Tupel von Subtypen nicht Muster

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

Ausführen dieses in Spielplatz erzeugt die folgende Ausgabe:

l is A 
failed to match tuple 

Offenbar Muster ein Tupel von Subtypen Anpassung funktioniert nicht. Ist das ein Fehler oder eine Funktion? Wenn es Letzteres ist, wäre es interessant zu wissen, warum.

+0

Zugehörige: [Tuple "Upcasting" in Swift] (http://stackoverflow.com/questions/31270507/tuple-upcasting-in-swift) – Hamish

Antwort

3

(Update: In Swift 3.1, verfügbar mit Xcode 8.3 Beta Code verhält sich nun wie erwartet.)

dies ein Fehler ist, und wird von SR-1423 verfolgt. Laut diesem Bericht wurde das Problem nun jedoch im Master-Zweig des Swift-Repositorys behoben, so dass alles gut gehen sollte, wenn Swift 3.1 auf den Markt kommt (expected release date ist "Frühjahr 2017").

jedoch bis dahin eine einfache Lösung ist einfach die Art jedes Element in dem Tupel einzeln zu überprüfen:

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

Oder wenn Sie brauchen l und r im case zu verwenden:

switch (l, r) { 
case let (l as A, r as A): 
    print("(\(l), \(r)) is (A, A)") 
default: 
    print("failed to match tuple") 
} 
Verwandte Themen