Swift:如何重新排序和省略存储在变量中的函数中的参数

Swift:如何重新排序和省略存储在变量中的函数中的参数,swift,function,parameters,parameter-passing,optional-parameters,Swift,Function,Parameters,Parameter Passing,Optional Parameters,我对Swift中的函数存储和传递有点熟悉,但是我对这方面的语言行为有一些具体问题 假设我们有一个变量函数MathOperation: var mathOperation: (Double, Double) -> Double 现在假设我们将其设置为函数减法: func subtract (minuend: Double, subtrahend: Double) -> Double { return minuend - subtrahend } mathOperation =

我对Swift中的函数存储和传递有点熟悉,但是我对这方面的语言行为有一些具体问题

假设我们有一个变量函数MathOperation:

var mathOperation: (Double, Double) -> Double
现在假设我们将其设置为函数减法:

func subtract (minuend: Double, subtrahend: Double) -> Double {
    return minuend - subtrahend
}
mathOperation = subtract
然后,我们应该能够使用

let result = mathOperation(3, 4.222)
但是,如果我们想传入一个参数更多的函数,或者参数的顺序与
mathOperation
调用的声明不同,该怎么办?例如:

func divide (dividend: Double, divisor: Double, roundToInt: Bool = false) -> Double { ... }
如何将
mathOperation
设置为
divide
,从而忽略
roundToInt

另外,是否可以对参数重新排序?假设我们在一个无法修改的库中有一个求幂函数:

func exponentiate (power: Double, base: Double) -> Double { ... }
在基之前有幂是不常见的,假设在使用
mathOperation
的地方,我们需要调用它,就好像它是用
声明的一样(基:双精度,幂:双精度)

有没有办法将
mathOperation
设置为
exponentiate
,以便在调用时反转参数

最后一个问题。假设我们有一个插值函数,我们想将其设置为
mathOperation

func interpolate (start: Double, end: Double, by: Double, nonlinearity: (Double) -> Double) -> Double { ... }
有没有办法将
mathOperation
设置为
interpolate
,以便

mathOperation (a, b)
导致

interpolate (start: a, end: b, by: 0.5, nonlinearity: { $0 })
如果其中任何一种情况都可能发生,最好有人能将我引向官方文档进行解释。

对于您的插入案例(其他案例如下),请定义以下内容:

mathOperation = { interpolate (start: $0, end: $1, by: 0.5, nonlinearity: { $0 })}
func interpolateToMathOperation (by: Double, nonlinearity: @escaping (Double) -> Double) -> (Double, Double) -> Double {
  return { interpolate (start: $0, end: $1, by: by, nonlinearity: nonlinearity)}
}
本质上,您将
插值
包装在一个闭包中,其中一些参数是固定的,例如本例中的
by
0.5
。(这称为“”)

您还可以使用以下内容来概括这一点:

mathOperation = { interpolate (start: $0, end: $1, by: 0.5, nonlinearity: { $0 })}
func interpolateToMathOperation (by: Double, nonlinearity: @escaping (Double) -> Double) -> (Double, Double) -> Double {
  return { interpolate (start: $0, end: $1, by: by, nonlinearity: nonlinearity)}
}
在给定默认的
by
非线性
参数的情况下,上述函数为
插值
返回一个
数学运算

在行动中:

  // Just add - only an example
  1> func interpolate (start: Double, end: Double, by: Double, nonlinearity: (Double) -> Double) -> Double { return start + end }

  6> func interpolateToMathOperation (by: Double, nonlinearity: @escaping (Double) -> Double) -> (Double, Double) -> Double { 
  7.   return { interpolate (start: $0, end: $1, by: by, nonlinearity: nonlinearity)} 
  8. } 
  9> var mathOperation = interpolateToMathOperation (by: 0.25, nonlinearity: { $0 })
mathOperation: (Double, Double) -> Double = 0x00000001005ea670 $__lldb_expr15`partial apply forwarder for __lldb_expr_14.(interpolateToMathOperation (by : Swift.Double, nonlinearity : (Swift.Double) -> Swift.Double) -> (Swift.Double, Swift.Double) -> Swift.Double).(closure #1) at repl14.swift

 10> mathOperation(1,2)
$R1: Double = 3

简短回答:这是不可能的。唯一的替代方法是使用闭包。