Ios 避免隐式展开变量

Ios 避免隐式展开变量,ios,iphone,swift4,xcode9.2,Ios,Iphone,Swift4,Xcode9.2,我有个问题要问你们。我试图避免使用隐式展开变量,但我还没有弄明白怎么做。下面是我的隐式展开示例 class MyView : UIView { @IBOutlet var button : UIButton! var buttonOriginalWidth : CGFloat! } 有没有一种方法可以避免隐式展开 非常感谢您的帮助。您可以通过添加?称为可选而不是!强制展开变量,例如: @IBOutlet var button : UIButton? 对于从故事板连接的插座,

我有个问题要问你们。我试图避免使用隐式展开变量,但我还没有弄明白怎么做。下面是我的隐式展开示例

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

}
有没有一种方法可以避免隐式展开


非常感谢您的帮助。

您可以通过添加?称为可选而不是!强制展开变量,例如:

@IBOutlet var button : UIButton?
对于从故事板连接的插座,它是一个有效的添加点,实际上它并不阻止您这样做,但默认情况下,它是从故事板连接的插座的选项。对于一个变量:

 var buttonOriginalWidth : CGFloat?
要使用可选的a变量,您需要首先检查它实际上是否仍然为零,使用if let或guard let,如下所示:

if let widthIsValid = buttonOriginalWidth {
   // use the widthIsValid here
}
如果您尝试在不强制展开的情况下使用变量,应用程序至少不会崩溃,例如,do like会像
可选(478431)
那样打印:

我建议您阅读Swift中的可选链接。

  • 如果是插座,不要避开它

    @IBOutlet var button : UIButton!
    
    是有意的。如果代码崩溃,则会显示设计错误(未连接插座)

  • 对于正则变量,特别是标量类型和字符串,将其声明为非可选

    var buttonOriginalWidth : CGFloat = 0.0
    

基本上,对于无法通过
init
初始化但第一次使用时应具有值的出口和变量,仅使用隐式展开选项。这取决于您——开发人员——仔细处理这些案例。在所有其他情况下,如果变量需要可选,请使用常规可选(
)。

可以通过以下方式避免隐式展开选项:

  • 声明初始值:

    var buttonOriginalWidth: CGFloat = 20.0
    
  • init
    中声明其值:

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

    var buttonOriginalWidth: CGFloat?
    
    但这当然意味着你下次打电话时必须自己打开它

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

  • 也就是说,您不应该总是避免使用隐式展开的选项。如果您使用的是故事板,它们尤其有用
    @IBOutlet
    @IBAction
    大部分声明为隐式展开选项

    @IBOutlet var button: UIButton!
    

    因为如果您正确地配置了故事板,它将永远不会成为
    nil

    谢谢您的示例和解释。但我的后续问题是,在这种情况下,您将如何执行
    var viewController:viewController
    
    @IBOutlet var button: UIButton!