展开不是可选的变量?
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 那么为什么我们必须解包它们?
即使 leftValStr
和 rightValStr
不是可选项,您也会强制展开 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.
我遇到了一个简单的计算器应用程序的这些代码行。
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 那么为什么我们必须解包它们?
即使 leftValStr
和 rightValStr
不是可选项,您也会强制展开 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.