Swift 中传递参数的顺序

Order of passed parameters in Swift

我目前正在学习关于 Swift 编程的 iTunes U 课程,并且卡在下面的代码示例中:

switch operation {
    case "×": performOperation { [=11=] *  }
    case "÷": performOperation {  / [=11=] }
    default: break
}

func performOperation(operation: (Double, Double) -> Double) {
    if operandQueue.count >= 2 {
        displayValue = operation(operandQueue.removeLast(),operandQueue.removeLast())
        enter()
    }
}

我的问题是:{ [=12=] * } 如何传递给 operation: (Double, Double) -> Double)?这段代码有效,但我只是不明白它是如何工作的。传递的参数似乎顺序不正确。从我阅读 performOperation 声明的方式来看,调用它的正确顺序 应该'*', [=14=], 。我只是看不到信件 因为顺序正确。我在这里错过了什么?

(Double, Double) -> Double 表示它是一个 函数,它接受两个 Double 作为参数,returns 一个 Double。

这个函数本身就是 performOperation 的参数。

当你调用performOperation { [=12=] * }时,{}部分是函数,[=14=]</code>是它的两个参数:<code>(Double, Double).

这是 performOperation 的声明:

func performOperation(operation: (Double, Double) -> Double)

这是一个名为 performOperation 的函数 (func),它采用通用函数 作为其唯一参数 。此函数必须采用两个双精度数((Double, Double),又名 [=14=]</code>)和 return 个双精度数(<code>-> Double)。 {[=17=] * } 是满足所有这些约束的函数。

这样是不是有点明白了?

这项工作的原因是因为在闭包中,参数 1 的名称是 [=10=],第二个参数的名称是 。因此,在闭包中,它所做的就是获取那些并对它们执行一些操作 returns a double

performOperation 需要一个 function/closure,它需要两个 Double 和 returns 一个 Double。它可以这样称呼:

performOperation( {(a: Double, b: Double) -> Double in return a * b } )

您可以省略类型,因为被调用的函数指定了它们:

performOperation( {(a, b) in return a * b } )

你可以删除 return 因为它只有一行:

performOperation( {(a, b) in a * b } )

然后你可以使用默认参数名称 $0 和 $1:

performOperation( { [=13=] *  } )

最后,您可以使用尾随闭包语法来消除括号:

performOperation { [=14=] *  }

最终版等同于第一版。它只是使用了几个快捷方式。

performOperation { [=11=] * }performOperation({(s1 : Double, s2 : Double) in return s1 * s2 }) 的简化简明形式。

此处的两个关键术语是 captureinference。 Swift 能够 "capture" 参数 s1 和 s2 的值以及 "infer" performOperation

return 值的类型

预计到达时间:跟进。这可以进一步简化和更简洁如下:

case "×": performOperation(*)

因为 * 已经作为一个函数存在,它接受 2 个 Double 和 returns 一个 Double。其他一切都通过推理工作。