我打开了可选值,但在解开Optional值时仍然意外地发现了这个nil

时间:2015-06-07 09:24:18

标签: ios swift

我是IOS开发的新手,无法弄清楚如何解决此错误。任何人都可以帮助我。以下是我的代码和我使用NSNumberFormatter()的代码部分的错误点。等待你的回复

class ViewController: UIViewController {

    @IBOutlet weak var display: UILabel!
    var usertyping
    = false

    @IBAction func appendDigit(sender: UIButton) {

        let digit = sender.currentTitle!
        if usertyping
        {
            display.text = display.text! + digit
        }
        else
        {
            display.text = digit
            usertyping = true
        }


    }

    @IBAction func operate(sender: UIButton) {

        let operation = sender.currentTitle!
        if usertyping{
            enter()
        }
        switch operation {
            case "×":
                if operandstack.count >= 2
                {
            displayValue = operandstack.removeLast() * operandstack.removeLast()
                    enter()
            }

        default: break

        }
    }
    var operandstack = Array<Double>()
    @IBAction func enter() {

        usertyping = false
        operandstack.append(displayValue)
        println("operandstack=\(operandstack)")

    }

    var displayValue: Double
        {
        get{

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

        }

        set{
            display.text="(\newValue)"
            usertyping=false
        }
    }   
}

3 个答案:

答案 0 :(得分:0)

我的猜测是失败了,因为display.text为零或某些无效值。

展开可选项不会阻止它为零。它说你意识到它可能是零,但你知道它不是。如果你错了而且它是零,它就会失败。

通常情况下,为您这样的事情展开选项会从文件加载图像。该文件可能会丢失,但您知道它不在您的程序中,因此您可以假设结果永远不会为零。

在您的情况下,我认为display.text可以为nil,您必须明确处理它或使用可选链接(?)。

答案 1 :(得分:0)

我看到2危险&#34;!&#34;在这一行

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

其中一个可能是您致命错误的原因。

  1. display.text!你确定文字不是零吗?
  2. numberFromString返回一个可选项,你确定你传递的输入是方法可以转换为NSNumber的吗?
  3. 希望这有帮助。

答案 2 :(得分:0)

这是因为如果找不到有效号码,numberFromString会返回nil

  

通过使用接收器解析字符串创建的NSNumber对象   格式。如果传递的字符串中没有数字,则返回nil。

参考here

如果您的display.text没有任何有效号码,该语句将会崩溃。

你可以通过以下方式解决这个问题:

var displayValue: Double
{
    get
    {
        var returnVal = NSNumber(int: 0)
        if let dVal   = NSNumberFormatter().numberFromString(display.text!)
        {
            returnVal = dVal
        }
        return returnVal.doubleValue
    }

    set
    {
        display.text = "(\newValue)"
        usertyping   = false
    }
}