展开不是可选的变量?

Unwrap variable which is not optional?

我遇到了一个简单的计算器应用程序的这些代码行。

func processOperation (operation: Operation) {
    if currentOperation != Operation.Empty {
        if runningNumber != "" {
            rightValStr = runningNumber
            runningNumber = ""

            if currentOperation == Operation.Multiply {
                result = "\(Double(leftValStr)! * Double(rightValStr)!)"
            } else if currentOperation == Operation.Divide {
                result = "\(Double(leftValStr)! / Double(rightValStr)!)"
            } else if currentOperation == Operation.Subtract {
                result = "\(Double(leftValStr)! - Double(rightValStr)!)"
            } else if currentOperation == Operation.Add {
                result = "\(Double(leftValStr)! + Double(rightValStr)!)"
            }

leftValStr 声明为 var leftValStr = ""

rightValStr 也声明为 var rightValStr =""

我想知道使用“!”的目的是什么? in \(Double(leftValStr)! / Double(rightValStr)!) 是为了什么? 据我所知,“!”用于解包可选。这里的 leftValStr 和 rightValStr 没有声明为 Optional 那么为什么我们必须解包它们?

即使 leftValStrrightValStr 不是可选项,您也会强制展开 Double(leftValStr)Double(rightValStr) 以及初始化 Double[= 的结果29=] 与 String 值可以是 nil.

例如,您不能用 Whosebug 字符串初始化 Double。

如果您想确保此转换结果正确,您可以使用 if let 来避免强制展开,例如:

if let leftValDouble = Double(leftValStr) {
    // do your code
} else {
    // handle error
}

请记住,如果您强制展开 nil 值,您的代码将会崩溃。

您正在使用的 Double 初始化程序是 failable 初始化程序,即它可能会创建 Double 或 return nil.

例子,

Double("3"),这里的"3"可以转换成Double,所以return是可选的Double对应3的值。

Double("abc"),这里"abc"不能转成Double,所以returns nil 在这种情况下。

在您的代码中,您使用的是 Double(""),它也无法转换为 Double,因此它 returns nil.

现在,当您 force unwrap 一个 nil 值时,它会导致运行时异常。

因此,Double(leftValStr)! 导致运行时异常。

Trying to use ! to access a nonexistent optional value triggers a runtime error. Always make sure that an optional contains a non-nil value before using ! to force-unwrap its value.