struct CalculatorBrain {
private var accumulator: Double?
func changeSign(operand: Double) -> Double {
return -operand
}
private enum Operation {
case constant(Double)
case unaryOperation((Double) -> Double)
}
private var operations: Dictionary<String,Operation> = [
"π" : Operation.constant(Double.pi),
"√" : Operation.unaryOperation(sqrt),
"±" : Operation.unaryOperation(changeSign) /* Cannot convert value of type '(CalculatorBrain) -> (Double) -> Double' to expected argument type '(Double) -> Double' */
]
}
我收到以“±”开头的行的错误消息。 我在网上查找了一个解决方案,这里有类似的问题。我在下面找到了可能的解但我不太明白发生了什么。有人可以帮忙吗?
答案 0 :(得分:2)
changeSign
函数是CalculatorBrain
的实例函数。
在Swift中,绑定到对象实例的任何函数实际上都具有类型(Type) -> (Arguments) -> ReturnType
,而不仅仅是(Arguments) -> ReturnType
。
如果您正在编写instance.doStuff(arguments)
之类的代码,那么后台实际发生的是部分应用Type.doStuff(instance)(arguments)
。 Type.doStuff(instance)
返回您可以使用其普通参数调用的实例函数。
当你直接在struct中创建操作字典而不是在它的函数或初始化器中时,Swift只能访问你的类型的静态成员,而不是changeSign
绑定到{{1}的实例1}},您将获得未绑定的CalculatorBrain
方法。
这就是为什么您的功能显示为CalculatorBrain.changeSign
而不仅仅是(CalculatorBrain) -> (Double) -> Double
。
要解决此问题,请将该方法设为静态,以便使用(Double) -> Double
实例删除部分应用程序,将该函数声明为全局函数或在CalculatorBrain
的初始值设定项中定义操作(尽管您在使用最后一种方法完成实例化之前,可能无法访问实例成员。
答案 1 :(得分:0)
尝试将changeSign
更改为static
。
非静态函数将具有隐含的&#34; self&#34;参数因此与您所追求的(Double) -> Double
不匹配。