2017-04-23 65 views
0

我正在查看这段代码,它创建了一个enum和一个使用枚举的字典,后来在字典上开关了一个开关。在这个Swift代码中会发生什么

这是从斯坦福大学CS193P计算器课程的解决方案。枚举中的其中一种情况包含此代码。

case binaryOperation(Double, Double) -> Double, (String, String) -> String 

在字典中的定义之一是这样的:

"*" : Operation.binaryOperation(*, {$0 + "*" + $1}) 

字典包含加,减,和分割相似的定义。

这个计算器工作正常。显示正确的答案,并在第二行中显示输入的说明。我不确定它是否正在计算正确的答案。

swift如何知道从第二个参数中取参数$ 0和$ 1并在第一个参数中使用它们?

我希望这个问题有道理。还有更多的代码涉及我没有显示。

+2

你的意思是'的情况下binaryOperation( (Double,Double) - > Double,(String,String) - > String)',对吗? (注意外括号)。 – Hamish

回答

1

Operation.binaryOperation(*, {$0 + "*" + $1}) 第一个参数(*)是一个函数,例如,这个定义:
func *(x: Double, y: Double) -> Double 所以它符合上面的(Double, Double) -> Double定义。

第二个参数是闭包(内嵌函数),它使用两个匿名参数$ 0和$ 1(Swift知道这些是字符串,因为有(String, String) -> String定义),并返回字符串。

在swift中,可以使用$ x语法来按位置处理参数。

你可以尝试更换与内联函数的第一个parametr 如{$0 * $1} 其减少的{return $0 * $1}

或用功能版本: Operation.binaryOperation(multiply, {$0 + "*" + $1})

func multiply(x: Double, y: Double) -> Double { return x * y }

相关问题