如何将任意类型的任意数量的参数的函数作为swift中的参数

时间:2015-10-17 02:34:19

标签: swift

这基本上就是我想做的事情:

一个函数,可以接受任意数量的参数和任何返回类型的函数

这甚至可能吗?

func fun1(x: Int,y: String){

}

func fun2(c: Float){

}

func thefunction(function,parameters) {
    function(parameters[0],parameters[1]...)
}

thefunction(fun1,3,"hi")
thefunction(fun2,4.5)

2 个答案:

答案 0 :(得分:1)

Swift有以下类型允许任何类型的参数:

AnyObject

此外,您可以在参数列表的末尾创建一个参数,以允许传递动态数量的参数。我直接从Apple文档中提取此信息以供参考:

func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}

您可以看到条目here。一点点的研究都会让人感到惊讶。

那就是说,我实际上并没有建议这样做。它使您的代码很难为其他人理解。如果你需要使函数如此通用以至于它可以逐字地获取任何对象并以任何数量返回任何对象,那么可能有更好的方法。

答案 1 :(得分:0)

Swift没有apply功能。但是你可以使用泛型函数:

func fun1(x: Int, y: String){
  print(x, y)
}

func fun2(c: Float){
  print(c)
}

func apply<Arg1, Return>(function: (Arg1) -> Return,_ arg: Arg1) ->    Return {
  return function(arg)
}

func apply<Arg1, Arg2, Return>(function: (Arg1, Arg2) -> Return, _ arg1: Arg1, _ arg2: Arg2) -> Return {
  return function(arg1, arg2)
}

apply(fun1, 1, "foo")
apply(fun2, 3.1)

缺点是每个arity需要一个通用apply。 好处是,如果使用错误的参数调用函数,则会出现编译器错误。

相关问题