При условии, что функция 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"