作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在使用以下代码时遇到问题:
private enum Op : Printable {
case Operand(Double)
case Constant(String, Double)
case Variable(String)
case UnaryOperation(String, Double -> Double)
case BinaryOperation(String, (Double, Double) -> Double)
var description: String {
get {
switch self {
case .Operand(let operand):
return "\(operand)"
case .Constant(let constant, _):
return constant
case .Variable(let variable):
return variable
case .UnaryOperation(let symbol, _):
return symbol
case .BinaryOperation(let symbol, _):
return symbol
}
}
}
}
private var knownOps = [String:Op]()
init() {
func learnOp(op: Op) {
knownOps[op.description] = op
}
learnOp(Op.Constant("π", M_PI))
learnOp(Op.UnaryOperation("√", sqrt))
learnOp(Op.UnaryOperation("sin", sin))
learnOp(Op.UnaryOperation("cos", cos))
learnOp(Op.UnaryOperation("±") { -1 * $0 })
learnOp(Op.BinaryOperation("×", *))
learnOp(Op.BinaryOperation("÷") { $1 / $0 })
learnOp(Op.BinaryOperation("+", +))
learnOp(Op.BinaryOperation("-") { $1 - $0 })
}
在 init() 完成后,字典 knownOps
包含以下内容:
knownOps [String : Calculator.CalculatorModel.Op] 9 key/value pairs
[0] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "×"
value Calculator.CalculatorModel.Op Operand Operand
[1] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "+"
value Calculator.CalculatorModel.Op Operand Operand
[2] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "÷"
value Calculator.CalculatorModel.Op Operand Operand
[3] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "π"
value Calculator.CalculatorModel.Op Constant Constant
[4] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "-"
value Calculator.CalculatorModel.Op Operand Operand
[5] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "±"
value Calculator.CalculatorModel.Op UnaryOperation UnaryOperation
[6] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "sin"
value Calculator.CalculatorModel.Op UnaryOperation UnaryOperation
[7] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "√"
value Calculator.CalculatorModel.Op UnaryOperation UnaryOperation
[8] _DictionaryElement<String, Calculator.CalculatorModel.Op>
key String "cos"
value Calculator.CalculatorModel.Op UnaryOperation UnaryOperation
我的问题是:为什么 binaryOperation
在字典中被捕获为 Operand
?
最佳答案
我将以下变量添加到您的枚举中:
var type: String {
get {
switch self {
case .Operand:
return "Operand"
case .Constant:
return "Constant"
case .Variable:
return "Variable"
case .UnaryOperation:
return "UnaryOperation"
case .BinaryOperation:
return "BinaryOperation"
}
}
}
然后使用以下代码循环遍历字典:
for (key, value) in knownOps
{
let valueType = value.type
println("\(key) : \(valueType)")
}
这给了我输出:
× : BinaryOperation
+ : BinaryOperation
÷ : BinaryOperation
π : Constant
- : BinaryOperation
± : UniaryOperation
sin : UniaryOperation
√ : UniaryOperation
cos : UniaryOperation
所以我想您的问题的答案是事实并非如此。我无法回答为什么调试器或您用来检查值的任何东西不正确,但您发布的代码没有错。
关于Swift - 枚举返回错误的值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31435599/
我是一名优秀的程序员,十分优秀!