Как передать массив в функцию, которая является вариативной в Swift? - PullRequest
1 голос
/ 05 июня 2019

Как передать массив в функцию, которая является переменной?

static func apply<T>(fn: (T ...) -> T, xs: [T]) -> T {
    return fn(xs)  // gives '[T]' is not convertible to 'T' error
}

Я пытаюсь получить что-то вроде

func foo(n: String ...) -> String {
    return n.joined(separator: ", ")
}

foo(n: "a", "b", "c")

apply(foo, "a", "b", "c")  // "a, b, c"

Я бы хотел, чтобы сигнатура функции fn: (T ...) -> T была, по возможности, переменной, меняя остальные значения в соответствии с необходимостью для решения проблемы.

1 Ответ

1 голос
/ 19 июля 2019

При условии, что функция variadic возвращает тот же тип, что и ее параметр (как в примере с 'foo'), тогда вы можете определить apply так:

func apply<T>(_ f:(T ...) -> T, with elements:[T]) -> T {
   var elements = elements

   if elements.count == 0 {
       return f()
   }

   if elements.count == 1 {
       return f(elements[0])
   }

   var result:T = f(elements.removeFirst(), elements.removeFirst())

   result = elements.reduce(result, {f($0, $1)} )

   return result
}

тогда назовите это:

func foo(_ n: String ...) -> String {
    return n.joined(separator: ", ")
}

func sum(_ numbers:Int ...) -> Int {
    return numbers.reduce(0, +)
}

let arrInt = [3, 5, 10]
apply(sum, with: arrInt) // 18

let arrString = ["apple", "peer", "banana"]
apply(foo, with: arrString) // "apple, peer, banana"
...