我有个问题。我试图避免做隐含的解包变量,但我还没弄清楚如何去做。这是我的隐式展开
的例子class MyView : UIView {
@IBOutlet var button : UIButton!
var buttonOriginalWidth : CGFloat!
}
有一种方法可以避免隐式展开吗?
我非常感谢你的帮助。
答案 0 :(得分:1)
可以通过以下方式避免隐式解包的选项:
声明初始值:
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!
因为如果您已正确配置了故事板,那么永远不会成为nil
。
答案 1 :(得分:0)
你可以通过添加来避免这种情况吗?叫做可选而不是!这就是强行解开变量,例如:
@IBOutlet var button : UIButton?
是一个有效的点,可以为从故事板连接的Outlets添加它,它实际上并没有阻止你这样做,但它默认是从故事板连接的Outlets选项。还有一个变量:
var buttonOriginalWidth : CGFloat?
要使用一个可选的变量,你需要首先检查它实际上是否仍然是使用if let或guard let如下:
if let widthIsValid = buttonOriginalWidth {
// use the widthIsValid here
}
如果你尝试使用变量而不用力展开应用程序,至少不会崩溃,例如,它会像Optional(478431)
那样打印出来:
print(buttonOriginalWidth)
我建议你阅读Swift中的Optional Chaining。
答案 2 :(得分:0)
如果是插座,请不要避免
@IBOutlet var button : UIButton!
是有意的。如果代码崩溃,它会显示设计错误(插座未连接)。
如果是常规变量 - 特别是标量类型和字符串 - 将其声明为非可选变量
var buttonOriginalWidth : CGFloat = 0.0
基本上使用隐式展开的选项仅用于无法通过init
初始化的出口和变量,但在第一次使用时应该具有值。由您 - 开发人员 - 来仔细处理案件。在所有其他情况下,如果变量需要是可选的,请使用常规可选(?
)。