隐式展开可选值并在 nil 时使用它的值

Implicitly unwrapped optional values and using its value if nill

A​​pple 文档说明了以下关于隐式解包可选的内容。

NOTE

If an implicitly unwrapped optional is nil and you try to access its wrapped value, you’ll trigger a runtime error. The result is exactly the same as if you place an exclamation mark after a normal optional that does not contain a value.

到目前为止,还不错。但是如果我们看到任何 UI 属性的引用都是隐式解包可选的。我一直在这样做 -

@IBOutlet weak var lbleemsx: UILabel!

    @IBOutlet weak var nmtxtfld: UITextField!
    override func viewDidLoad()

    {
        super.viewDidLoad()

      lbleemsx.text = nmtxtfld!.text


    }

现在,如果用户没有在文本字段中输入任何内容,nmtxtfld!.text 的值为 nil,因为我在我的代码中使用了它的值,那么它应该 return 错误,但它没有吨。为什么会这样?

你有点糊涂了。在这种情况下,它是 nmtxtfld - UITextField 实例,它是隐式解包的可选对象。 属性 不是 nil,因为它是在您从 NIB 文件或故事板场景实例化视图控制器时设置的。如果您只是在没有 NIB 或故事板的情况下分配了一个新的视图控制器实例,那么 nmtxtfld 将为 nil,并且当您尝试访问它时会出现运行时异常。

访问 nmtxtfld.text 不会出现运行时异常的原因是,正如其他人在评论和答案中解释的那样,当 UITextField 为空时,它是 text 属性 不是零,它是一个空字符串 ""

text 属性 是可选的,因此它 可以 为零,但在这种情况下,您将其分配给 text UILabel 的 属性,其 text 属性 也是可选的,所以即使 nmtxtfld.text nil分配是可以的,因为你可以将 nil 分配给一个可选的。

如果 nmtxtfld.text 是 nil 而你说了类似 let aString=nmtxtfld.text! 那么你会得到一个运行时异常,因为你已经明确地解包了一个 nil。