我目前正在参加有关Swift编程的iTunes U课程,我坚持使用下面的代码示例:
switch operation {
case "×": performOperation { $0 * $1 }
case "÷": performOperation { $1 / $0 }
default: break
}
func performOperation(operation: (Double, Double) -> Double) {
if operandQueue.count >= 2 {
displayValue = operation(operandQueue.removeLast(),operandQueue.removeLast())
enter()
}
}
我的问题是:{ $0 * $1 }
如何传递给operation: (Double, Double) -> Double)
?这段代码有效,但我不知道它是如何工作的。传递的参数似乎没有按正确的顺序排列。从我如何阅读performOperation的声明,调用它的正确顺序应该 '*', $0, $1
。我只是看不到这些信件
按照正确的顺序。我在这里缺少什么?
答案 0 :(得分:2)
performOperation
接受一个函数/闭包,它需要两个Double
并返回一个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( { $0 * $1 } )
最后,您可以使用尾随闭包语法来消除括号:
performOperation { $0 * $1 }
最终版本与第一版相同。它只使用了几个快捷方式。
答案 1 :(得分:0)
(Double, Double) -> Double
表示它是一个函数,它将两个双打作为参数并返回一个Double。
此函数本身是performOperation
的参数。
当您致电performOperation { $0 * $1 }
时,{}
部分是该功能,$0
和$1
是其两个参数:(Double, Double)
。
答案 2 :(得分:0)
这里是performOperation的声明:
func performOperation(operation: (Double, Double) -> Double)
这是一个名为func
的函数(performOperation
),它将泛型函数作为唯一的参数。此函数必须使用两个双精度((Double, Double)
,又称$0
和$1
)并返回双精度(-> Double
)。 {$0 * $1}
是一个满足所有这些约束的函数。
这有点清楚吗?
答案 3 :(得分:0)
这项工作的原因是因为在闭包中,参数1的名称是$0
,第二个名称是$1
。因此,在闭包中它所做的是接受那些并对它们执行一些返回双重
答案 4 :(得分:0)
performOperation { $0 * $1 }
是performOperation({(s1 : Double, s2 : Double) in return s1 * s2 })
的简化简明形式。
此处的两个关键字词为capture
和inference
。 Swift能够“捕获”参数s1和s2的值,并“推断”return
的{{1}}值的类型
ETA:跟进。这可以进一步简化,并使其更加简洁如下:
performOperation
由于case "×": performOperation(*)
已经作为一个需要2个双打并返回Double的函数存在。其他一切都是通过推理来实现的。