【问题标题】:Swift performance on optional UI elements可选 UI 元素的快速性能
【发布时间】:2018-12-16 02:14:13
【问题描述】:

在 Swift 中设置 UILabel 我可以执行以下操作

@IBOutlet var wLabel: UILabel!

@IBOutlet var wLabel: UILabel?

设置我可以做的文本

wLabel.text = "..."

或者,对于后者做

wLabel?.text = "..." // with a question mark for the optional

保持它们是可选的将有助于它们意外为零的情况,因为它会跳过此调用并继续执行代码。如果标签为 nil,则使用 ! 声明它们会使应用程序崩溃。

现在您为什么不将所有内容都设为可选?我能想到的唯一原因是为了更好的性能。如果我的应用程序有很多 UI 元素,那么我是否应该避免让它们成为可选元素,所以它们是可选的意味着性能方面的劣势?我无法在任何地方找到有关此的任何信息。

【问题讨论】:

  • 它们都是可选的。没有性能差异。
  • “保持它们可选将有助于它们意外为零的情况” - 但如果意外为零,您希望它崩溃,因为这是开发过程中的编程错误。防止崩溃实际上并不能解决问题,它会隐藏它。
  • 嗯,我可以想到一些情况,你希望某些东西继续运行,而不检查 nil。例如 2 个界面控制器,除了几个按钮外,它们的工作方式相同。您可以为它们使用相同的类,但您必须为任一类相应地调整您的代码。使用? 将让您无需任何修改即可继续操作
  • 显然,如果组件真的是可选的,你就不会让它成为隐式展开的可选。
  • 虽然,在这种情况下,创建两个控制器并将共享代码提取到超类是合理的。

标签: swift uikit optional


【解决方案1】:

使用 ?在您的 Outlet 中将使您的代码无法追踪

崩溃在某些情况下非常好,因为如果没有崩溃,那么即使是很小的错误也很难追踪。

考虑带有! 的@IBOutlet 示例:

@IBOutlet var wLabel: UILabel!
wLabel.isEnabled = true

只需从情节提要中删除您的 Outlet 标签的连接并运行应用程序,您的应用程序将在 wLabel.isEnabled = true 上崩溃。由于您遇到了崩溃,因此您可以进入情节提要查看连接是否正确。如果没有连接,你添加它,该死的!你轻松解决了问题。

现在考虑带有? 的@IBOutlet 示例:

@IBOutlet var wLabel: UILabel?
wLabel?.isEnabled = true

做同样的事情,只需从情节提要中删除您的 Outlet 标签的连接并运行应用程序,您的应用程序根本不会崩溃。您将无法知道错误,从而使您的代码一团糟且无法追踪。

Apple 人非常清楚可选的事情,他们确实强制解开 @IBOutlet 是有原因的。当然!?之间没有性能差异

【讨论】:

    【解决方案2】:

    如果您将某些东西设置为插座,则将其设置为强制展开可选(带有感叹号 !),因为 Swift 要求您的类在构造对象时初始化其所有属性(即 @987654322 @方法被调用)。出口不是在对象构造期间创建的,而是稍后在 xib 或情节提要数据加载到组件中时分配的。强制解包选项基本上是一种表示您保证属性将在对象的 init 被调用之后和它们被使用之前被初始化的方式。

    使用其中任何一种都不会提高性能。 Optional? 类型意味着属性可以是 nil 或具有值。强制解包可选! 表示该属性在使用时保证具有值。是否支持这取决于开发人员,如果其值为nil,则使用此类属性将导致崩溃。

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2013-02-25
      • 2011-11-30
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多