为什么标签的默认类型是强制展开的可选类型?

Why the default type of the label is a forced unwrapped optional?

当我在 view 中创建一个 label(从对象库中拖出)并制作 IBOutlet连接标签viewController(Ctrl+拖动),默认代码由Xcode生成例如,@IBOutlet weak var displayColumn: UILabel!

我可以把感叹号删掉,只设置成UILable。但是 Xcode 希望它成为强制展开的可选类型一定有充分的理由。

问题:我想我不明白为什么要在这里使用可选类型。因为我已经在我的视图中创建了一个标签并将其连接到我的控制器,所以它就在那里,它存在,我创建了它。为什么 Xcode 想要一个选项作为默认类型?如果它说标签内的文本是一个选项,这对我来说听起来很合理,因为标签可能在 运行 时间的某个时候是空的。

非常感谢

您在 Xcode 中创建了一个标签,并向 Xcode 表明您希望该标签连接到 @IBOutlet。但这种联系直到后来才发生。

这是运行时的事件顺序。

  1. viewController 已创建(实例化)。
  2. 故事板或 .xib 未存档。此时创建标签。
  3. @IBOutlet@IBAction是相连的。

在Swift中,当实例化一个class时,必须初始化所有属性。在第 1 步中,网点为 nil,因为它们尚未连接。为了允许这样做,它们必须声明为 Optionals.

使用正常的可选是完全有效的,例如:

@IBOutlet weak var displayColumn: UILabel?

但是每次访问它时,您都必须处理解包问题。 @IBOutlet 唯一为 nil 的情况是第 3 步尚未发生时(例如,在 prepareForSegue 中)或者您忘记连接插座或重命名插座。在这些情况下,访问 nil 导致的崩溃会提醒您注意问题。