0

我有一个问题要问你们。我试图避免做隐式展开变量,但我还没有弄清楚如何去做。这是我的隐式展开示例

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

}

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

我会非常感谢你的帮助。

4

3 回答 3

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

话虽如此,您不应该总是避免使用隐式展开的选项。如果您使用 Storyboard,它们特别有用。@IBOutlet并且@IBAction主要被声明为隐式展开的可选项。

@IBOutlet var button: UIButton!

因为如果您正确配置了 Storyboard,它将永远不会nil.

于 2018-02-14T20:02:04.090 回答
0
  • 如果是插座,请不要避开

    @IBOutlet var button : UIButton!
    

    打算。如果代码崩溃,它会显示设计错误(未连接插座)。

  • 如果是常规变量——尤其是标量类型和字符串——将其声明为非可选

    var buttonOriginalWidth : CGFloat = 0.0
    

基本上,仅对无法通过初始化init但在第一次使用时应该具有值的出口和变量使用隐式未包装的选项。由您 - 开发人员 - 来谨慎处理这些案例。在所有其他情况下,如果变量需要是可选的,请使用常规可选 ( ?)。

于 2018-02-14T19:54:01.723 回答
0

您可以通过添加来避免这种情况?称为可选而不是!这是强制解包变量,例如:

@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 中的可选链。

于 2018-02-14T19:36:31.987 回答