Swift中传递参数的顺序

时间:2015-07-26 13:30:43

标签: swift parameter-passing

我目前正在参加有关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。我只是看不到这些信件 按照正确的顺序。我在这里缺少什么?

5 个答案:

答案 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 })的简化简明形式。

此处的两个关键字词为captureinference。 Swift能够“捕获”参数s1和s2的值,并“推断”return的{​​{1}}值的类型

ETA:跟进。这可以进一步简化,并使其更加简洁如下:

performOperation

由于case "×": performOperation(*) 已经作为一个需要2个双打并返回Double的函数存在。其他一切都是通过推理来实现的。