我正在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/

10-12 18:50