展开不是可选的变量?

时间:2017-05-30 12:01:12

标签: swift optional unwrap

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

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 =""

我想知道使用"!"的目的是什么?在\(Double(leftValStr)! / Double(rightValStr)!)中是为了什么? 据我所知,"!"用于展开可选项。 leftValStr和rightValStr在这里没有声明为Optional,为什么我们要打开它们呢?

2 个答案:

答案 0 :(得分:0)

即使leftValStrrightValStr不是选项,您也需要展开{​​{1}}和Double(leftValStr)以及初始化 Double 的结果字符串值可以是Double(rightValStr)

例如,您无法使用nil字符串初始化Double。

如果您想确保此转换结果正确,可以使用stackoverflow来避免强制解包,例如:

if let

请记住,如果您强行打开if let leftValDouble = Double(leftValStr) { // do your code } else { // handle error } 值,您的代码就会崩溃。

答案 1 :(得分:0)

您使用的Double初始值设定项是failable初始值设定项,即可能会创建Double或返回nil

示例

加倍(" 3"),这里" 3"可以转换为Double,因此它返回一个对应于3的可选Double值。

Double(" abc"),这里" abc"无法转换为Double,因此在这种情况下会返回nil

在您的代码中,您使用的是&#(""),它也无法转换为Double,因此会返回nil

现在,当您force unwrap nil时,它将导致运行时异常。

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

  

尝试使用!访问不存在的可选值会触发a   运行时错误。始终确保可选项包含非零值   使用前的价值!强行解开它的价值。