作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试了解有关递归枚举的更多信息。
这是我的代码:
enum Operation {
case Unary((Double) -> Double)
case Binary((Double, Double) -> Double)
indirect case Combined(Operation, Operation)
}
let x = 7.0
let y = 9.0
let z = x + y
let plus = Operation.Binary{$0 + $1}
let squareRoot = Operation.Unary{sqrt($0)}
let combined = Operation.Combined(plus, squareRoot)
switch combined {
case let .Unary(value):
value(z)
case let .Binary(function):
function(x, y)
case let .Combined(mix):
mix(plus, squareRoot)
}
如何依次执行plus
和squareRoot
操作?
我一直收到这个错误:
Cannot call value of non-function type (Operation, Operation)
最佳答案
使用 .Unary
和 .Binary
你做对了。您正在检索函数并执行它们。
但是,使用 .Combined
时,您正在检索一个操作元组并将其用作一个函数。您应该做的是检索元组中的函数并执行它们。
您可以使用递归函数代替 switch,如下所示:
func handleOperation(operation: Operation) {
switch operation {
case let .Unary(value): value(z)
case let .Binary(function): function(x, y)
case let .Combined(op1, op2): [op1, op2].map(handleOperation)
}
}
关于Swift 递归枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37941537/
我是一名优秀的程序员,十分优秀!