0

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

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 那么为什么我们必须解开它们呢?

4

2 回答 2

0

即使leftValStrandrightValStr不是可选项,您也将强制展开Double(leftValStr),并且使用StringDouble(rightValStr)值初始化Double的结果可以是.nil

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

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

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

请记住,如果你强制解包一个nil值,你的代码将会崩溃。

于 2017-05-30T12:06:09.243 回答
0

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

例如

Double("3"),这里的 "3" 可以转换成Double,所以它返回一个Double对应于 3 的可选值。

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

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

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

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

尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请务必确保可选项包含非零值!强制解包它的值。

于 2017-05-30T12:14:07.303 回答