arrow - swift closure parameters



Passando um array para uma função com um número variável de args no Swift (4)

Na Swift Programming Language , diz:

As funções também podem ter 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 um array dentro da função.

Pergunta: e se eu já tiver uma matriz de números que desejo passar para essa 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 posso passar para uma função variadica?

https://src-bin.com


Answer #1

Aqui está um trabalho 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 variadic:

func sumOf(numbers: [Int]) -> Int {
    var total = 0
    for i in numbers {
        total += i
    }
    return total
}

Passo 2: Chame isso de dentro da sua função variadica:

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}

Passo 3: Ligue de qualquer maneira:

var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])

Parece estranho, mas está funcionando nos meus testes. Deixe-me saber se isso causa problemas imprevistos para qualquer um. O Swift parece ser 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 a resposta do @ manojid sugere, você só precisará atualizar essas funções. Caso contrário, você terá que passar por muita renomeação.


Answer #2

Eu fiz isso (Wrapper + Identity Mapping):

func addBarButtonItems(types: REWEBarButtonItemType...) {
    addBarButtonItems(types: types.map { $0 })
}

func addBarButtonItems(types: [REWEBarButtonItemType]) {
    // actual implementation
}

Answer #3

Você pode transmitir a função:

typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])

Answer #4

Você pode usar uma função auxiliar como tal:

func sumOf (numbers : [Int])  -> Int { return numbers.reduce(0, combine: +) }
func sumOf (numbers : Int...) -> Int { return sumArray (numbers) }




variadic-functions