为什么标签的默认类型是强制解包的可选项?

SLN*_*SLN 1 xcode optional uilabel ios swift

当我在视图中创建标签(从Object库中拖动)并使IBOutlet连接标签viewController(Ctrl和拖动)时,Xcode生成的默认代码是,例如,@IBOutlet weak var displayColumn: UILabel!

我可以删除感叹号并将其设置为UILable唯一.但是必须有一个很好的理由Xcode希望它是一个强制解包的可选类型.

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

非常感谢

vac*_*ama 9

您已在Xcode中创建了一个标签,并向Xcode表明您希望该标签与之相连@IBOutlet.但这种联系直到晚些时候才会发生.

这是运行时事件的顺序.

  1. viewController被创建(实例化).
  2. 故事板或.xib未归档.此标签是在此时创建的.
  3. @IBOutletS和@IBActions为连接.

在Swift中,当实例化一个类时,必须初始化所有属性.在步骤1中,出口是nil因为它们还没有连接.为了实现这一点,必须将它们声明为Optionals.

使用普通的Optional是完全有效的,例如:

@IBOutlet weak var displayColumn: UILabel?
Run Code Online (Sandbox Code Playgroud)

但是每次你访问它时你都必须处理它的展开.只有@IBOutlet当nil尚未发生时(例如,在步骤3中prepareForSegue)或者您忘记连接插座或重命名它时,唯一的时间是零.在这些情况下,通过访问nil提醒您遇到问题导致崩溃.