ios - 将 nil 分配给强制解包选项不会导致代码崩溃,这是为什么呢?

标签 ios swift xcode

我正在初步构建一个计算器。目前,代码只是在用户点击时将数字和 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) 界面

touchDigit 函数链接到所有数字按钮,如下图所示。 displayUILableperformOperaton 是 PI 按钮

enter image description here

问题:您可能找到了行(代码的第三行)UILabel! = 无。我认为将 nil 添加到强制解包选项会使代码崩溃,但它不会,到目前为止,代码工作正常。这是为什么?

最佳答案

Unwrapped optional 是与编译器的约定,当它被访问时,值不会是nil。考虑以下 Playground 代码。

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 在评论中指出的那样,您的 socket 将在加载 Xib 时分配给。

关于ios - 将 nil 分配给强制解包选项不会导致代码崩溃,这是为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38661172/

相关文章:

swift - 如何使用 ** 用于指数使用 @infix func **( )?

ios - 快速推送/append 数组

xcode - 安装 Xcode 7 后的编译器警告找不到选项 '-F ...' 的目录

ios - 如何找出哪个约束不起作用或产生问题

ios - UIStackView 内部的 View 未使用 AutoLayout 调整大小

ios - 可选类型 'Bool' 不能用作 boolean 值;改为测试 '!= nil'

ios - 无法从 Xcode 7 中的资源目录检索非 jpg/png 文件

xcode - Swift 3 中的隐藏按钮

ios - 使用 objectsWhere() 查询 Realm 数据库时的 CVaListPointer

ios - 在另一个文本字段中输入四位数字后,文本字段应成为第一响应者