protocol myProtocol {}
func doSomething(with params: (some myProtocol)...) {
// Implementation goes here
}
extension Int: myProtocol {}
doSomething(with: 1, 2, 3)
Erro de compilação na linha de declaração func:
'alguns' tipos são permitidos apenas em propriedades, subscritos e funções
Eu poderia simplesmente omitir completamente a palavra-chave, mas ela será considerada 'qualquer' por padrão. Conseqüentemente, não posso passar os parâmetros para uma função que espera [some SyntaxProtocol]
como parâmetro.
Use genéricos para obter o mesmo resultado
some
e permitir apenas um tipo específico que esteja em conformidade com o protocoloPor que você não pode usar
some
parâmetros variadosProibir o uso de tipos opacos
some Protocol
( ) em parâmetros variados foi uma decisão consciente dos desenvolvedores da linguagem. Porque entraria em conflito com outro recurso de linguagem proposto chamadovariadic generics
:Fonte: https://github.com/apple/swift-evolution/blob/main/proposals/0341-opaque-parameters.md#variadic-generics
Então, não é algum bug ou descuido. Está funcionando como pretendido.
Qual é o significado dessa
some
palavra-chave na declaração do tipo de parâmetro?Mas o que você deve fazer com seu código? Bem, precisamos verificar por que esse recurso de idioma foi adicionado e o que ele está fazendo "nos bastidores":
E foi introduzido para tornar a função com uso intenso de genéricos "mais leve" e mais fácil de ler .
Para transformar código como:
nisso:
Ambos os trechos são equivalentes, a versão
some View
durante a compilação apenas se transforma em versão de função genérica.Fonte: https://github.com/apple/swift-evolution/blob/main/proposals/0341-opaque-parameters.md#proposed-solution
O que você deveria fazer
Como foi dito antes: este açúcar sintático está explicitamente indisponível para parâmetros variados. Portanto, a única solução óbvia seria voltar à sintaxe "não açucarada" e usar parâmetros genéricos:
E funcionará como pretendido (se você pretende que todos os parâmetros da lista variada tenham exatamente o mesmo tipo, isso confirma
myProtocol
, ofc).