Na linguagem de programação Swift , diz:
As funções também podem receber um número variável de argumentos, coletando-os em uma matriz.
func sumOf(numbers: Int...) -> Int { ... }
Quando eu chamo essa função com uma lista de números separados por vírgula (`sumOf (1, 2, 3, 4)), eles são disponibilizados como uma matriz dentro da função.
Pergunta: e se eu já tiver uma matriz de números que deseje passar para esta função?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Isso falha com um erro do compilador, "Não foi possível encontrar uma sobrecarga para '__conversion' que aceita os argumentos fornecidos". Existe uma maneira de transformar uma matriz existente em uma lista de elementos que eu posso passar para uma função variável?
swift
variadic-functions
Ole Begemann
fonte
fonte
Respostas:
Splatting ainda não está no idioma , conforme confirmado pelos desenvolvedores. A solução alternativa por enquanto é usar uma sobrecarga ou aguardar se você não puder adicionar sobrecargas.
fonte
sumOf(...numbers)
print
!Aqui está uma solução que eu encontrei. Eu sei que não é exatamente o que você quer, mas parece estar funcionando.
Etapa 1: Declare a função que você gostaria com uma matriz em vez de argumentos variados:
Etapa 2: chame isso de dentro da sua função variável:
Etapa 3: Ligue de qualquer maneira:
Parece estranho, mas está funcionando nos meus testes. Deixe-me saber se isso causa problemas imprevistos para alguém. Swift parece capaz de separar a diferença entre as duas chamadas com o mesmo nome de função.
Além disso, com esse método, se a Apple atualizar o idioma como sugere a resposta do @ manojid, você só precisará atualizar essas funções. Caso contrário, você terá que passar por várias renomeações.
fonte
Você pode converter a função:
fonte
func sumOf(foo numbers: Int..., bar: Bool) -> Int {};
exigetypealias Function = (foo: [Int], bar: Bool) -> Int;
unsafeBitCast
. Isso pode funcionar hoje, mas, a menos que uma referência o diga, a próxima versão do compilador é livre para literalmente fazer qualquer coisa aqui (erro do compilador / falha / código de execução aleatória ...). Veja o aviso sério no unsafeBitCast .Você pode usar uma função auxiliar como tal:
fonte
Int...
e não pode (facilmente) ser alterada?apply
procedimento. Eu acho que algumas pessoas chamam isso de 'splatting'.sumArray
referenciado aqui?Sei que esta resposta não responde à sua pergunta exata, mas acho que vale a pena notar. Eu também estava começando a brincar com Swift e imediatamente me deparei com uma pergunta semelhante. A resposta da Manojld é melhor para sua pergunta, concordo, mas, novamente, outra solução alternativa que me veio à cabeça. Por acaso também gosto mais do Logan.
No meu caso, eu só queria passar uma matriz:
Só queria compartilhar, caso alguém mais estivesse pensando como eu. Na maioria das vezes eu preferiria passar o array assim, mas ainda não acho o "Swiftly". :)
fonte
Eu fiz isso (Wrapper + Mapeamento de identidade):
fonte
Swift 5
Esta é uma abordagem com
@dynamicCallable
recurso que permite evitar sobrecargas ou queunsafeBitCast
você deve especificar um específicostruct
para chamar:fonte