将 nil 分配给强制解包选项不会导致代码崩溃,这是为什么呢?
Assign a nil to a forced unwrapping optional doesn't crash the code, why is that?
我正在初步构建计算器。目前,代码只是在用户点击时将数字和 Pi 打印到计算器的标签中。
1)车码
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var display: UILabel! = nil //Look Here "(
var userIsInTheMiddleOfTypeing = false
@IBAction func touchDigit(_ sender: UIButton){
let digit = sender.currentTitle!
if userIsInTheMiddleOfTypeing {
let textCurrentlyInDisplay = display.text!
display.text = textCurrentlyInDisplay + digit
} else {
display.text = digit
}
userIsInTheMiddleOfTypeing = true
}
@IBAction func performOperation(_ sender: UIButton) {
userIsInTheMiddleOfTypeing = false
if let methematicalSymbol = sender.currentTitle {
if methematicalSymbol == "π" {
display.text = String(M_PI) // M_PI
}
}
}
}
2) UI
touchDigit函数链接到所有数字按钮,如下图所示。 display 是 UILable
而 performOperaton 是 PI 按钮
问题:您可能找到了行(代码的第三行)UILabel! = nil
。我认为将 nil
添加到强制解包选项会使代码崩溃,但它 不会 并且到目前为止,代码工作正常。这是为什么?
当您将变量声明为强制解包可选时
var labelForced: UILabel! = nil
与常规可选变量的所有区别
var label: UILabel? = nil
当您尝试获取它的值时,强制解包的可选值将始终尝试隐式解包(除非您将显式标记为安全解包,例如let text = labelForced?.text
).所有其他行为相同
Unwrapped optional 是与编译器的约定,当 访问 时,该值不会是 nil
。考虑以下游乐场代码。
var x: Int! = nil // It's declared as an unwrapped optional *var*
x = 5 // So assigning to it is OK
var y: Int = x // you can access its value, if it's not nil
x = nil // even assigning nil is OK
//y = x // CRASH. *Accessing* it when nil causes an error
在您的声明中添加 = nil
实际上是虚假的 - 如果您删除它,该变量仍将初始化为 nil
,并且正如@MartinR 在评论中指出的那样,您的出口将是加载 Xib 时指定。
当我在第 2 点下查看您的 UI 时,我发现您已将 UI 标签连接到情节提要中的标签。那是对的吗?
如果这是正确的,当您在声明 UILabel 时将其设置为 nil 时,应用程序不会崩溃。一旦视图生命周期方法是 运行,UILabel 声明并初始设置为 nil,将连接到故事板中的 UILabel。
您可以通过实施视图生命周期方法来检查这一点,并让它将 UI标签打印到控制台。
我正在初步构建计算器。目前,代码只是在用户点击时将数字和 Pi 打印到计算器的标签中。
1)车码
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var display: UILabel! = nil //Look Here "(
var userIsInTheMiddleOfTypeing = false
@IBAction func touchDigit(_ sender: UIButton){
let digit = sender.currentTitle!
if userIsInTheMiddleOfTypeing {
let textCurrentlyInDisplay = display.text!
display.text = textCurrentlyInDisplay + digit
} else {
display.text = digit
}
userIsInTheMiddleOfTypeing = true
}
@IBAction func performOperation(_ sender: UIButton) {
userIsInTheMiddleOfTypeing = false
if let methematicalSymbol = sender.currentTitle {
if methematicalSymbol == "π" {
display.text = String(M_PI) // M_PI
}
}
}
}
2) UI
touchDigit函数链接到所有数字按钮,如下图所示。 display 是 UILable
而 performOperaton 是 PI 按钮
问题:您可能找到了行(代码的第三行)UILabel! = nil
。我认为将 nil
添加到强制解包选项会使代码崩溃,但它 不会 并且到目前为止,代码工作正常。这是为什么?
当您将变量声明为强制解包可选时
var labelForced: UILabel! = nil
与常规可选变量的所有区别
var label: UILabel? = nil
当您尝试获取它的值时,强制解包的可选值将始终尝试隐式解包(除非您将显式标记为安全解包,例如let text = labelForced?.text
).所有其他行为相同
Unwrapped optional 是与编译器的约定,当 访问 时,该值不会是 nil
。考虑以下游乐场代码。
var x: Int! = nil // It's declared as an unwrapped optional *var*
x = 5 // So assigning to it is OK
var y: Int = x // you can access its value, if it's not nil
x = nil // even assigning nil is OK
//y = x // CRASH. *Accessing* it when nil causes an error
在您的声明中添加 = nil
实际上是虚假的 - 如果您删除它,该变量仍将初始化为 nil
,并且正如@MartinR 在评论中指出的那样,您的出口将是加载 Xib 时指定。
当我在第 2 点下查看您的 UI 时,我发现您已将 UI 标签连接到情节提要中的标签。那是对的吗? 如果这是正确的,当您在声明 UILabel 时将其设置为 nil 时,应用程序不会崩溃。一旦视图生命周期方法是 运行,UILabel 声明并初始设置为 nil,将连接到故事板中的 UILabel。
您可以通过实施视图生命周期方法来检查这一点,并让它将 UI标签打印到控制台。