Swift 5.1中的递归枚举问题

问题描述 投票:1回答:1

我正在使用Swift文档在Swift 5.1中学习递归枚举。

这里是代码。

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)

    func evaluate(_ expression: ArithmeticExpression) -> Int {
        switch expression {
        case let .number(value):
            return value
        case let .addition(left, right):
            return evaluate(left) + evaluate(right)
        case let .multiplication(left, right):
            return evaluate(left) * evaluate(right)
        }
    }
}

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

print(ArithmeticExpression.evaluate(product))

“屏幕”

我认为代码的最后一行出了问题。

这是什么意思?

swift xcode enums console lldb
1个回答
0
投票

evaluate(_:)ArithmeticExpression实例函数,即,您必须将其称为ArithmeticExpression的实例(该实例是self所指)。 evaluate(_:)的类型为(ArithmeticExpression) -> IntSwift可让您在类型上调用实例函数。您得到的是一个

unbound instance function

。也就是说,尚未绑定任何值的函数为其self值。这就是您独自运行ArithmeticExpression.evaluate时要执行的操作。您返回的未绑定实例函数的类型为:(ArithmeticExpression) -> (ArithmetricExpression) -> Int // ^--- the "self" ^--- the "expression" param ^--- the final return value.

通过调用它并提供product作为参数(ArithmeticExpression.evaluate(product)),您得到的是类型为(ArithmeticExpression) -> Int的函数。此函数是

绑定实例函数

,即self现在已绑定(它现在具有product的值),但是它正在等待再次调用,并以另一个ArithmeticExpression作为参数。 >有两种方法可以解决此问题,以实现所需的目标:

  1. 将其设为静态函数。静态函数未在实例上调用,而是在类型上直接调用,如您尝试的那样:

    indirect enum ArithmeticExpression { case number(Int) case addition(ArithmeticExpression, ArithmeticExpression) case multiplication(ArithmeticExpression, ArithmeticExpression) // Make it static here static func evaluate(_ expression: ArithmeticExpression) -> Int { switch expression { case let .number(value): return value case let .addition(left, right): return evaluate(left) + evaluate(right) case let .multiplication(left, right): return evaluate(left) * evaluate(right) } } } let five = ArithmeticExpression.number(5) let four = ArithmeticExpression.number(4) let sum = ArithmeticExpression.addition(five, four) let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2)) print(ArithmeticExpression.evaluate(product))

  2. 保留evaluate作为实例函数,但直接在要评估的实例上调用它,而不是在类型上调用它。由于self是您感兴趣的表达式,因此您不再需要expression参数:

    indirect enum ArithmeticExpression { case number(Int) case addition(ArithmeticExpression, ArithmeticExpression) case multiplication(ArithmeticExpression, ArithmeticExpression) func evaluate() -> Int { switch self { case let .number(value): return value case let .addition(left, right): return left.evaluate() + right.evaluate() case let .multiplication(left, right): return left.evaluate() * right.evaluate() } } } let five = ArithmeticExpression.number(5) let four = ArithmeticExpression.number(4) let sum = ArithmeticExpression.addition(five, four) let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2)) print(product.evaluate())

  3. 我会说这可能是更“惯用”的版本。
© www.soinside.com 2019 - 2024. All rights reserved.