无法转换类型'(CalculatorBrain) - >的值(双) - > Double'到期望参数类型'(Double) - >双'

时间:2018-02-01 03:26:43

标签: swift type-conversion

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'  */
    ]
}

我收到以“±”开头的行的错误消息。 我在网上查找了一个解决方案,这里有类似的问题。我在下面找到了可能的解但我不太明白发生了什么。有人可以帮忙吗?

Similar Question + solution (1)

Similar Question + Solution (2)

2 个答案:

答案 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不匹配。