为什么在创建对象时需要先解开dataType?迅捷5

问题描述

每当我在ViewController类中创建任何对象时上网或在线检查项目时,在数据类型末尾都会出现一个感叹号(!),这是为什么呢?例如:@IBOutlet弱var标签:UILabel! 那为什么是'!'标记或为什么我们要强制展开它? 而且,当我删除它时,它给出了一个错误,我们也可以这样写@IBOutlet弱var Label = UILabel() 那我们为什么不使用它呢?

解决方法

您需要逐步了解事物以获得答案。

  1. @IBOutlet:这是一个属性包装程序,它告诉Xcode将故事板上的元素与.swift文件中的元素相连。
  2. !标记:推荐使用这种强制拆包的方法,因为当.swift文件需要实例时,一定会在情节提要中找到连接的元素。我们也可以写@IBOutlet弱var标签:UILabel?在这种情况下,实例Label是可选的。
  3. @IBOutlet弱var Label = UILabel():在这种情况下,实例Label's的值在初始化后立即被UILabel()覆盖。 @IBOutlet weak var Label!之后的LabelLabel = UILabel()是不同的实例。

@IBOutlet weak var label: UILabel等同于编写var label: UILabel。因此,i-val没有初始值,Swift不允许这样做。在Swift中,您必须为变量分配一个值,或者使其成为可选值/展开后才能显式处理nil值。而且,当您用@IBOutlet解开实例时,以后可以像?一样将它与label?.text = "Some text"一起使用。

因此,我们被迫使用!?作为出口,以像其他变量声明中那样显式地使变量成为可选变量。而且我们在声明后不使用= UILabel(),因为它会覆盖从情节提要中创建的实例(已通过笔尖中的NSCoder/Coder初始化)。