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

标签 ios swift xcode uilabel option-type

当我在 View 中创建一个标签(从对象库中拖拽)并制作IBOutlet来连接标签viewController(Ctrl 和拖动),Xcode 生成的默认代码是,例如,@IBOutlet weak var displayColumn: UILabel!

我可以删除感叹号并将其设置为仅 UILable。但是 Xcode 希望它成为强制解包的可选类型一定有充分的理由。

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

非常感谢

最佳答案

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

这是运行时的事件顺序。

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

在Swift中,当一个类被实例化时,所有的属性都必须被初始化。在第 1 步中, socket 为 nil,因为它们尚未连接。为了实现这一点,它们必须声明为Optionals

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

@IBOutlet weak var displayColumn: UILabel?

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

关于ios - 为什么标签的默认类型是强制展开的可选类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38672995/

相关文章:

objective-c - 使用变量 iOS 更改背景颜色

ios - iOS7 中的自定义振动

swift - 在类扩展中包装泛型方法

html - 是否可以在 native iOS HTML 页面中使用 "mailto"按钮?

objective-c - NSTimer 的问题

ios - FBLikeControl 回调

ios - 为 iOS 实现 Google 登录时出现 Apple Mach-O 链接器错误

ios - 如何防止同时滚动多个 UIScrollView 对象?

iOS PDFKit 禁用垂直滚动反弹

c++ - 如何构造可以使用指针成员对指针数组进行排序的函数