为强制解包分配一个nil可选不会导致代码崩溃,为什么会这样?

时间:2016-07-29 14:21:12

标签: ios swift xcode options

我正在建立计算器的初始方法。目前,代码只是在用户点击数字和Pi时将数字和Pi打印到计算器的标签中。

1)Che Code

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)用户界面

touchDigit 功能链接到所有数字按钮,如下图所示。 显示UILable,而 performOperaton 是PI按钮

enter image description here

问题:您可能会找到该行(代码的第三行)UILabel! = nil。我认为在强制解包可选项中添加nil会导致代码崩溃,但不会,到目前为止,代码运行正常。这是为什么?

3 个答案:

答案 0 :(得分:4)

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加载时。

答案 1 :(得分:1)

当您将变量声明为强制解包可选

var labelForced: UILabel! = nil

与常规可选变量

的所有区别
var label: UILabel? = nil

是当你试图获取它的值时,强制解包的可选项将始终尝试隐式解包(除非您将标记明确安全的unwrapp,例如let text = labelForced?.text)。所有其他行为都是相同的

答案 2 :(得分:1)

当我在第2点看你的UI时,我发现你已经将UILabel连接到故事板中的标签了。那是对的吗? 如果这是正确的,则在声明UILabel时将应用程序设置为nil时应用程序不会崩溃。一旦视图生命周期方法正在运行,UILabel声明并初始设置为nil,它将连接到故事板中的UILabel。

您可以通过实现视图生命周期方法来检查这一点,并让它将UILabel打印到控制台。