避免隐式展开变量

时间:2018-02-14 19:20:49

标签: ios iphone swift4 xcode9.2

我有个问题。我试图避免做隐含的解包变量,但我还没弄清楚如何去做。这是我的隐式展开

的例子
class MyView : UIView {
    @IBOutlet var button : UIButton!
    var buttonOriginalWidth : CGFloat!

}

有一种方法可以避免隐式展开吗?

我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

可以通过以下方式避免隐式解包的选项:

  1. 声明初始值:

    var buttonOriginalWidth: CGFloat = 20.0
    
  2. init

    中声明其值
    var buttonOriginalWidth: CGFloat
    
    init() {
        self.buttonOriginalWidth = 20
        super.init()
    }
    
  3. 您始终可以将其声明为可选:

    var buttonOriginalWidth: CGFloat?
    

    但这当然意味着你下次打电话时必须自己打开它。

  4. 您还可以使用lazy声明在init之后设置的属性。

  5. 话虽这么说,你不应该总是避免使用隐式解包的选项。如果您使用的是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初始化的出口和变量,但在第一次使用时应该具有值。由您 - 开发人员 - 来仔细处理案件。在所有其他情况下,如果变量需要是可选的,请使用常规可选(?)。