swift - 如何将数组传递给 Swift 中可变参数的函数?

标签 swift variadic

如何将数组传递给可变参数的函数?

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 的函数签名保持为可变参数,根据需要更改其余部分以适应解决问题的需要。

最佳答案

如果可变参数函数返回与其参数相同的类型(如您的“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"

关于swift - 如何将数组传递给 Swift 中可变参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462732/

相关文章:

c++ - 可变参数模板递归类型传递

C++ 11可变数量的参数,相同的特定类型

ios - 从 tableView 中删除行时更改默认背景颜色

ios - 根据背景颜色调整图标颜色

ios - Swift 跳过一个动画 (UIView.animate)

ios - 侧边菜单 didSelect 方法在 Swift 中不起作用

ios - 带有 NSValue 的 Swift NSCoding

c++ - VS2010 C++ 可变参数模板示例

c++ - 如何使用(类似?)可变参数模板在 C++14 中编写位掩码

将数组转换为函数参数