Construindo um projeto no Xcode 11.4 beta 3, estou recebendo este erro do Swift Compiler em uma enumeração:
O caso enum possui uma única tupla como valor associado, mas existem vários padrões aqui, tuplicando implicitamente os padrões e tentando correspondê-los
Código fonte:
switch result {
case .error(let err):
//
case .value(let staff, let locations): // <-- error on this line
//
}
Result
é uma enumeração genérica com valores associados para .error
e .value
. Nesse caso, o valor associado é um tupple.
public enum Result<T> {
case value(T)
case error(Error)
}
Não se lembre de ter visto esse erro antes e a pesquisa não resultou em nenhum resultado. Alguma ideia?
Result
, eu concordo, é o código antigo que antecedeSwift.Result
. Isso não tem nada a ver com o problema.Respostas:
Descobri que você também pode silenciar esse erro tratando o valor associado mais como uma tupla, envolvendo-o em um conjunto extra de colchetes:
fonte
let
saída se quiser vincular tudo:case let .value( (staff, locations) ):
ecase .value( let (staff, locations) ):
ambos compilarem. Escolha o seu favorito!Ok, entendi. Parece que
enum
com valores associados, em que o tipo de valor é um tupple, não pode mais ser correspondido em uma instrução switch como esta:Solução
Os valores do tupple precisam ser extraídos manualmente no Xcode 11.4 (Swift 5.2):
fonte
Este é um problema conhecido: https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_release_notes
Por exemplo, deixar de fora parênteses ao ativar um Opcional de um tipo de tupla causa um erro do compilador:
}
Solução alternativa : adicione parênteses extras para tuplicar explicitamente o padrão:
}
fonte
Se me permite, gostaria de adicionar uma resposta para a
if case
versão também.e, claro, ignorando o caso:
fonte