我正在iTunesU上学习CS193P课程。我有一个与第一个作业有关的问题-可编程计算器。我已经尝试按照讲座和作业分配中的说明添加π按钮。但是,按π键后再按Enter或and操作数会导致崩溃,并显示以下消息:“致命错误:在展开可选值时意外发现nil”
class CalculatorBrain
{
private enum Op {
case Operand(Double)
case NullaryOperation(String, () -> Double)
case UnaryOperation(String, Double -> Double)
case BinaryOperation(String, (Double,Double) -> Double)
var description: String{
get {
switch self {
case .Operand(let operand): return "\(operand)"
case .NullaryOperation(let symbol, _): return symbol
case .UnaryOperation(let symbol, _): return symbol
case .BinaryOperation(let symbol,_):return symbol
}
}
}
}
private var opStack = [Op]()
private var knownOps = [String:Op]() //initialize dictionary
init() {
func learnOp (op: Op) {
knownOps[op.description] = op
}
learnOp(Op.BinaryOperation("×", *))
learnOp(Op.BinaryOperation("÷", { $1 / $0 }))
learnOp(Op.BinaryOperation("+", +))
learnOp(Op.BinaryOperation("−", { $1 - $0 }))
learnOp(Op.UnaryOperation("√", sqrt))
learnOp(Op.UnaryOperation("sin", sin))
learnOp(Op.UnaryOperation("cos", cos))
learnOp(Op.NullaryOperation("π", { M_PI }))
}
我已经能够在视图控制器中强制使用它,但是知道这是一个hack:
var displayValue: Double{
get{
// I don't understand why I had to put this hack in for π
// if (calcDisplay.text != "π"){
return NSNumberFormatter().numberFromString(calcDisplay.text!)!.doubleValue
// } else {
// return M_PI
// }
}
set{
calcDisplay.text = "\(newValue)"
userIsInTheMiddleOfTyping = false
}
}
我是Swift / Obj-C的新手。有人可以帮我指出正确的方向来解决这个问题吗?
完整资料:https://github.com/philnewman/Calculator
最佳答案
NSNumberFormatter().numberFromString
用于将数字字符串转换为数字。 “数字字符串”是内容形式为以下形式的字符串:
([:digit:]+(\.[:digit:]*)?)|(\.[:digit:]+)
其中
[:digit:]
是数字集{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
。本质上,它将仅解析字符在
0-9
和可选.
内的字符串中的数字。由于
π
不属于这10个字符集,因此将被拒绝,并且NSNumberFormatter
无法解析字符串中的数字。关于ios - CS193P分配1π,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28529933/