【问题标题】:Swift: why the IBoutlet are not assigned (=) to their type instead they are just having a forced unwrapping type (!)斯威夫特:为什么 IBoutlet 没有分配(=)到他们的类型,而是他们只是有一个强制展开类型(!)
【发布时间】:2019-10-14 07:30:42
【问题描述】:

我想知道为什么像 UILable 的类型这样的 IBoutlets 被声明为:

@IBoutlet weak var theNameOfThelable: UILabel!

而不是: @IBoutlet weak var theNameOfThelable = UILabel()

如果我成功了会发生什么:

@IBoutlet weak var theNameOfThelable = UILabel()

【问题讨论】:

  • UILable() 您正在为 IBOUtlet 分配默认标签对象。这将无效并在连接到情节提要时分配另一个参考。
  • 当它像这样@IBoutlet weak var theNameOfThelable: UILabel!时,这意味着这个变量是UILabel类型的,它肯定需要在那里(故事板会为你创建它,事实上,它会是当然,如果你正确连接了 IBOutlet),但第二个变体:@IBoutlet weak var theNameOfThelable = UILabel(),实际上是一个新 UILabel 的实例化,它将不再指向你在情节提要中设置的 UILabel。
  • 我的问题是我如何能够使用它并访问 UILabel 的属性,当它没有被声明为 = UIlabel()
  • 它被标记为 UILabel!。它只是隐式展开的可选。为什么你不能访问它的属性?

标签: swift iboutlet


【解决方案1】:

在下面的代码中,

@IBoutlet weak var theNameOfThelable: UILabel!

上面的语句是一个隐式解包的可选。这意味着它的值将在以后分配,而不仅仅是在init 中。

此外,一旦插座在init 之后和viewDidLoad() 之前连接到情节提要,@IBOutlet 将自动分配。

另一方面,

@IBoutlet weak var theNameOfThelable = UILabel()

在这里,您将一个全新的UILabel() 实例分配给outlet。这不会连接到storyboard

在这两种情况下,UILabel!UILabel() 的分配是不同的。您仍然可以访问UILabel 的属性。只有在您使用 UILabel! 之前未连接它时,应用程序才会引发运行时异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多