快速处理计算器,我陷入了困境

时间:2015-12-08 17:47:39

标签: ios swift

我刚接触编码,现在只是学习。快速的代码,我遇到了障碍,似乎无法弄清楚,所以我一直在斯坦福YouTube频道上快速编码,他们正在做一个计算器。目前我们正试图获得双倍价值。

@IBOutlet weak var display: UILabel!

var userIsInTheMiddleOfTypingANumber = false

@IBAction func appendDigit(sender: UIButton) {
    let digit = sender.currentTitle!
    if userIsInTheMiddleOfTypingANumber {
        display.text = display.text! + digit
    } else {
        display.text = digit
        userIsInTheMiddleOfTypingANumber = true
    }

}

var operandStack: Array<Double> = Array<Double>()

@IBAction func enter() {
    userIsInTheMiddleOfTypingANumber = false
    operandStack.append(displayValue)
    print("operandStack = \(operandStack)")

}

var displayValue: Double {
    get {
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
        // This is my problem and comes back with exc_bad_instruction (code=exc_i387_invop  any help would be greatly appreciated on this! thank you for your time!
    }
    set {
        display.text = "\(newValue)"
        userIsInTheMiddleOfTypingANumber = false

    }

}

1 个答案:

答案 0 :(得分:0)

除了Martin R:实际上你有两大问题,两者都与你打开选项有关。

首先是这一行:

@IBOutlet weak var display: UILabel!

问题是! @IBOutlet链接到故事板中的视图。但是根据GUI所处的阶段,可能还有display尚未存在。所以这应该是一个可选的标记?不!然后你的编译器会抱怨这一行:

return NSNumberFormatter().numberFromString(display.text!)!.doubleValue

他会抱怨显示器可能不存在,你不能这样做。您可能会“解决”这样的问题:

return NSNumberFormatter().numberFromString(display!.text!)!.doubleValue

但是如果display没有准备好,或者NSNumberFormatter不能将字符串转换为数字,这将失败。你永远不会知道为什么。所以停止使用强制解包。但是,您可以使用不同的工具来解决问题。但首先你应该考虑你的问题。你的问题最终不是每个字符串都可以转换为double。所以你必须在某个时候处理这​​个问题。有无数的可能性。但作为初学者,如果你的代码在可选(可以是nil值)实际为零时会崩溃,那么你可以使用这种模式:

if let thisValueIsNotNil = dontKnowIfItIsNil {
   // Do something with thisValueIsNotNil - it is save
}

编辑:IMO在这篇博文中很好地解释了一个机制的核心问题: http://appventure.me/2014/06/13/swift-optionals-made-simple/