首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CS193P分配1π

CS193P分配1π
EN

Stack Overflow用户
提问于 2015-02-15 19:04:34
回答 4查看 909关注 0票数 0

我正在iTunesU上学习iTunesU课程。我有一个关于第一次作业的问题--可编程计算器。我尝试添加π按钮,如讲座和作业作业中所描述的。但是,按下后面跟着enter或和操作数的π键会导致崩溃,其消息是:“致命错误:意外地发现为零”,同时展开可选值“”。

代码语言:javascript
复制
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 }))
}

我可以在视图控制器中强制使用它,但知道这是一个黑客:

代码语言:javascript
复制
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的新手。有人能帮我找到正确的方向来解决这个问题吗?

资料来源:https://github.com/philnewman/Calculator

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-15 19:15:50

NSNumberFormatter().numberFromString旨在将数字字符串转换为数字。“数字字符串”是指其内容为形式的字符串:

代码语言:javascript
复制
([:digit:]+(\.[:digit:]*)?)|(\.[:digit:]+)

其中[:digit:]是一组数字,{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

本质上,它将只解析来自字符串的数字,这些字符串的字符位于0-9和可选的.中。

因为π不属于这组10个字符,所以它被拒绝,并且NSNumberFormatter无法解析字符串中的数字。

票数 0
EN

Stack Overflow用户

发布于 2015-07-27 21:21:02

代码语言:javascript
复制
@IBAction func appendPi(sender: UIButton) {

    let x = M_PI
    if userIsInTheMiddleOfTypingANumber {
        displayValue = x
        display.text = "\(displayValue)"
    }else {
        displayValue = x
        userIsInTheMiddleOfTypingANumber = true
        enter()
    }
}

为PI创建了一个与其他函数分离的新的UIButton函数。为我工作试试看。

票数 1
EN

Stack Overflow用户

发布于 2015-03-08 18:42:40

我正在做同样的课程,但由于我还没有分离出MVC (将在下一个作业中这样做),我只能给您一个提示,您哪里出错了。因为它对我有用..。

您的黑客正在将calcDisplay.text测试为"π",但是此时calcDisplay.text应该已经是3,14159。这就是我在工作任务上用印刷品查过的。

因此,我可以向您展示我的部分代码,这对于MVC来说还不是最优的:

代码语言:javascript
复制
   case "cos": performOperation{cos($0)}
    case "∏": performConstant(operation)

func performOperation (operation: (Double) -> Double) {
    if operandStack.count >= 1 {
        displayValue = operation(operandStack.removeLast())
        enter()
    }
}

func performConstant (symbol: (String)) {
    switch symbol {
    case "∏": displayValue = M_PI
    default: break
    }
    display.text = "\(displayValue)"
    enter()
}

我认为它也可能是最优的,但它可能会帮助您在代码中找到bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28529933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档