Beim Erstellen eines Projekts in Xcode 11.4 Beta 3 wird dieser Swift Compiler-Fehler in einer Aufzählung angezeigt:
Der Enum-Fall hat ein einzelnes Tupel als zugeordneten Wert, aber hier gibt es mehrere Muster, die implizit die Muster tupeln und stattdessen versuchen, diese abzugleichen
Quellcode:
switch result {
case .error(let err):
//
case .value(let staff, let locations): // <-- error on this line
//
}
Result
ist eine generische Aufzählung mit zugehörigen Werten für .error
und .value
. In diesem Fall ist der zugehörige Wert ein Tupple.
public enum Result<T> {
case value(T)
case error(Error)
}
Erinnern Sie sich nicht, diesen Fehler zuvor gesehen zu haben, und die Suche danach ergab keine Ergebnisse. Irgendwelche Ideen?
Result
, ich stimme zu, ist es alter Code, der älter ist alsSwift.Result
. Das hat aber nichts mit dem Thema zu tun.Antworten:
Ich habe festgestellt, dass Sie diesen Fehler auch zum Schweigen bringen können, indem Sie den zugehörigen Wert eher wie ein Tupel behandeln, indem Sie ihn in zusätzliche Klammern setzen:
quelle
let
Sie in Betracht, das Out zu verschieben, wenn Sie alles binden möchten:case let .value( (staff, locations) ):
undcase .value( let (staff, locations) ):
beide kompilieren. Wählen Sie Ihren Favoriten!Ok, habe es herausgefunden. Scheint so, als ob
enum
mit zugeordneten Werten, bei denen der Werttyp ein Tupple ist, eine switch-Anweisung wie diese nicht mehr abgeglichen werden kann:Lösung
Werte aus tupple müssen in Xcode 11.4 (Swift 5.2) manuell extrahiert werden:
quelle
Dies ist ein bekanntes Problem: https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_release_notes
Das Auslassen von Klammern beim Einschalten eines optionalen Tupeltyps führt beispielsweise zu einem Compilerfehler:
}}
Problemumgehung : Fügen Sie zusätzliche Klammern hinzu, um das Muster explizit zu tupeln :
}}
quelle
Wenn ich darf, möchte ich auch eine Antwort für die
if case
Version hinzufügen .und dann natürlich den Fall ignorieren:
quelle