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

时间:2016-07-30 10:44:38

标签: ios swift xcode uilabel optional

当我在视图中创建标签(从对象库中拖出)并使 IBOutlet 连接标签时 viewController (按住Ctrl并拖动),Xcode生成的默认代码为@IBOutlet weak var displayColumn: UILabel!

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

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

非常感谢

1 个答案:

答案 0 :(得分:7)

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

这是运行时事件的顺序。

  1. 创建(实例化)viewController。
  2. 故事板或.xib已取消归档。此标签是在此时创建的。
  3. @IBOutlet@IBAction已连接。
  4. 在Swift中,当实例化一个类时,必须初始化所有属性。在步骤1中,出口是nil,因为它们尚未连接。为了实现这一点,必须将它们声明为 Optionals

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

    @IBOutlet weak var displayColumn: UILabel?
    

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