gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:22:17 25 4
gpt4 key购买 nike

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

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

var mathOperation: (Double, Double) -> Double

现在假设我们将其设置为函数 Subtract:

func subtract (minuend: Double, subtrahend: Double) -> Double {
return minuend - subtrahend
}
mathOperation = subtract

然后我们应该可以用

调用 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 { ... }

在 base 之前有 power 是不寻常的,假设在使用 mathOperation 的地方,我们需要调用它,就好像它是用 (base: Double, power : 双).

有没有办法将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 })}

本质上,您将 interpolate 包装在一个闭包中,其中一些参数是固定的,例如本例中的 by0.5。 (这称为“partial application”)

您还可以将其归纳为如下内容:

func interpolateToMathOperation (by: Double, nonlinearity: @escaping (Double) -> Double) -> (Double, Double) -> Double {
return { interpolate (start: $0, end: $1, by: by, nonlinearity: nonlinearity)}
}

在给定默认 bynonlinearity 参数的情况下,上面的代码为 interpolate 返回了一个 mathOperation

在行动中:

  // 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

关于Swift:如何重新排序和省略存储在变量中的函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com