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 })
的简化简明形式。
此处的两个关键术语是 capture
和 inference
。 Swift 能够 "capture" 参数 s1 和 s2 的值以及 "infer" performOperation
的 return
值的类型
预计到达时间:跟进。这可以进一步简化和更简洁如下:
case "×": performOperation(*)
因为 *
已经作为一个函数存在,它接受 2 个 Double 和 returns 一个 Double。其他一切都通过推理工作。
我目前正在学习关于 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 })
的简化简明形式。
此处的两个关键术语是 capture
和 inference
。 Swift 能够 "capture" 参数 s1 和 s2 的值以及 "infer" performOperation
return
值的类型
预计到达时间:跟进。这可以进一步简化和更简洁如下:
case "×": performOperation(*)
因为 *
已经作为一个函数存在,它接受 2 个 Double 和 returns 一个 Double。其他一切都通过推理工作。