当我在视图中创建标签(从对象库中拖出)并使 IBOutlet 连接标签时和 viewController (按住Ctrl并拖动),Xcode生成的默认代码为@IBOutlet weak var displayColumn: UILabel!
我可以删除感叹号并仅将其设置为UILable
。但是必须有一个很好的理由Xcode希望它是一个强制解包的可选类型。
问题:我不认为我理解在这里使用可选类型的原因。因为我已经在我的视图中创建了一个标签并将其连接到我的控制器,所以它确实存在,它存在,我创建它。为什么Xcode想要一个选项作为默认类型?如果它说标签内的文字是一个选项,那对我来说听起来很合理,因为标签在运行时的某个时刻可能是空的。
非常感谢
答案 0 :(得分:7)
您已在Xcode中创建了一个标签,并向Xcode表明您希望该标签与@IBOutlet
相关联。但是这种联系直到晚些时候才会发生。
这是运行时事件的顺序。
@IBOutlet
和@IBAction
已连接。在Swift中,当实例化一个类时,必须初始化所有属性。在步骤1中,出口是nil
,因为它们尚未连接。为了实现这一点,必须将它们声明为 Optionals 。
使用普通的可选是完全有效的,例如:
@IBOutlet weak var displayColumn: UILabel?
但是每次访问它时你都必须处理它的展开。 @IBOutlet
唯一的时间是nil是第3步尚未发生(例如,在prepareForSegue
中),或者您忘记连接插座或重命名它。在这些情况下,访问nil
导致的崩溃会提醒您解决问题。