可选UI元素的快速性能

时间:2018-12-15 16:16:23

标签: swift uikit optional

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

@IBOutlet var wLabel: UILabel!

@IBOutlet var wLabel: UILabel?

设置我可以做的文字

wLabel.text = "..."

或者,对于后者,

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

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

现在为什么不将所有内容都设为可选?我能想到的唯一原因是为了获得更好的性能。如果我的应用程序具有很多UI元素,那么我是否应该远离它们的可选性,因此它们是可选的会对性能造成不利影响?我在这里找不到任何信息。

2 个答案:

答案 0 :(得分:2)

使用?您的插座中的代码将使您的代码无法使用

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

使用!考虑@IBOutlet的示例:

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

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

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

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

做同样的事情,只需从情节提要中删除出口标签的连接并运行该应用程序,您的应用程序将完全不会崩溃。您将无法知道该错误,因此会使您的代码变得混乱且难以理解。

苹果公司的人非常了解可选内容,他们确实出于某种原因强行解开@IBOutlet。当然,!?之间没有性能差异

答案 1 :(得分:1)

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

使用这两种方法都不会提高性能。 Optional?类型表示属性可以是nil或具有值。强制解包的可选!表示该属性在使用时保证具有值。坚持这一决定由开发人员决定,如果其值为nil,则使用此类属性会导致崩溃。