如何在Swift中将数组传递给可变参数函数?

3
如何将数组传递给可变参数函数?
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
https://dev59.com/LWAg5IYBdhLWcg3wDHbS#24024428 - undefined
如果可能的话,我不能更改apply函数的函数签名。我希望保持fn: (T ...)不变。 - undefined
Swift目前无法将数组拼接为可变参数。 - undefined
2
根据所引用的问答,你不能将数组传递给接受可变参数的函数。这是无法绕过的限制。 - undefined
显示剩余4条评论
1个回答

3

如果可变参数函数的返回类型与其参数相同(就像您的'foo'示例一样),那么您可以像这样定义应用程序:

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"

2
只要可变参数函数返回与其参数相同的类型,并且是可结合的 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接