Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么标签的默认类型是强制展开的可选类型?_Ios_Swift_Xcode_Uilabel_Optional - Fatal编程技术网

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

Ios 为什么标签的默认类型是强制展开的可选类型?,ios,swift,xcode,uilabel,optional,Ios,Swift,Xcode,Uilabel,Optional,当我在视图中创建一个标签(从对象库拖动)并使IBOutlet连接标签和视图控制器(Ctrl和drag)时,Xcode生成的默认代码是,例如,@IBOutlet弱var displayColumn:UILabel 我可以删除感叹号并将其设置为仅可UILable。但是Xcode希望它是一个强制展开的可选类型,这肯定有一个很好的理由 问题:我想我不明白在这里使用可选类型的原因。因为我已经在我的视图中创建了一个标签,并将其连接到我的控制器,它就在那里,它存在,我创建了它。为什么Xcode需要一个选项作为

当我在视图中创建一个标签(从对象库拖动)并使IBOutlet连接标签和视图控制器(Ctrl和drag)时,Xcode生成的默认代码是,例如,
@IBOutlet弱var displayColumn:UILabel

我可以删除感叹号并将其设置为仅可
UILable
。但是Xcode希望它是一个强制展开的可选类型,这肯定有一个很好的理由

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


非常感谢

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

这是运行时事件的顺序

  • 将创建(实例化)viewController
  • 故事板或.xib未归档。此时将创建标签
  • 已连接
    @IBOutlet
    s和
    @IBAction
    s
  • 在Swift中,实例化类时,必须初始化所有属性。在步骤1中,插座为
    nil
    ,因为它们尚未连接。为了实现这一点,必须将其声明为可选

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

    @IBOutlet weak var displayColumn: UILabel?
    

    但是,每次访问它时,您都必须将其展开。
    @IBOutlet
    唯一为零的时间是当步骤3尚未发生时(例如,在
    prepareForSegue
    中),或者如果您忘记连接插座或将其重命名。在这些情况下,由于访问
    nil
    而导致的崩溃会提醒您该问题。

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

    这是运行时事件的顺序

  • 将创建(实例化)viewController
  • 故事板或.xib未归档。此时将创建标签
  • 已连接
    @IBOutlet
    s和
    @IBAction
    s
  • 在Swift中,实例化类时,必须初始化所有属性。在步骤1中,插座为
    nil
    ,因为它们尚未连接。为了实现这一点,必须将其声明为可选

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

    @IBOutlet weak var displayColumn: UILabel?
    

    但是,每次访问它时,您都必须将其展开。
    @IBOutlet
    唯一为零的时间是当步骤3尚未发生时(例如,在
    prepareForSegue
    中),或者如果您忘记连接插座或将其重命名。在这些情况下,由于访问
    nil
    而导致的崩溃会提醒您这个问题。

    让您非常痛苦。解释得很好,清晰明了!太谢谢你了。解释得很好,清晰明了!