我有一个问题要问你们。我试图避免做隐式展开变量,但我还没有弄清楚如何去做。这是我的隐式展开示例
class MyView : UIView {
@IBOutlet var button : UIButton!
var buttonOriginalWidth : CGFloat!
}
有一种方法可以避免隐式 unwrap 吗?
我会非常感谢你的帮助。
可以通过以下方式避免隐式展开的选项:
声明一个初始值:
var buttonOriginalWidth: CGFloat = 20.0
在 内声明其值init
:
var buttonOriginalWidth: CGFloat
init() {
self.buttonOriginalWidth = 20
super.init()
}
您始终可以将其声明为可选:
var buttonOriginalWidth: CGFloat?
但这当然意味着您下次调用它时必须自己打开它。
您还可以使用lazy
来声明设置在 之后的属性init
。
话虽如此,您不应该总是避免使用隐式展开的选项。如果您使用 Storyboard,它们特别有用。@IBOutlet
并且@IBAction
主要被声明为隐式展开的可选项。
@IBOutlet var button: UIButton!
因为如果您正确配置了 Storyboard,它将永远不会是nil
.
如果是插座,请不要避开
@IBOutlet var button : UIButton!
打算。如果代码崩溃,它会显示设计错误(未连接插座)。
如果是常规变量——尤其是标量类型和字符串——将其声明为非可选
var buttonOriginalWidth : CGFloat = 0.0
基本上,仅对无法通过初始化init
但在第一次使用时应该具有值的出口和变量使用隐式未包装的选项。由您 - 开发人员 - 来谨慎处理这些案例。在所有其他情况下,如果变量需要是可选的,请使用常规可选 ( ?
)。
您可以通过添加来避免这种情况?称为可选而不是!这是强制解包变量,例如:
@IBOutlet var button : UIButton?
为从情节提要连接的插座添加它是一个有效的点,它实际上并不会阻止您这样做,但默认情况下它是从情节提要连接的插座的选项。还有一个变量:
var buttonOriginalWidth : CGFloat?
并且要使用可选的 a 变量,您需要首先使用 if let 或 guard let 检查它实际上是否仍然为零,如下所示:
if let widthIsValid = buttonOriginalWidth {
// use the widthIsValid here
}
如果您尝试使用变量而不强制打开应用程序,至少不会崩溃,例如执行如下操作Optional(478431)
:
print(buttonOriginalWidth)
我建议你阅读 Swift 中的可选链。