避免隐式展开变量

Posted

技术标签:

【中文标题】避免隐式展开变量【英文标题】:Avoiding implicit unwrap variable 【发布时间】:2018-02-14 19:20:48 【问题描述】:

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

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


有没有办法避免隐式展开?

非常感谢您的帮助。

【问题讨论】:

【参考方案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!

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

【讨论】:

感谢您的样品和解释。但我的后续问题是在这种情况下你会怎么做var viewController: ViewController!【参考方案2】:

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

@IBOutlet var button : UIButton?

为从情节提要连接的奥特莱斯添加它是一个有效点,它实际上并不会阻止您这样做,但默认情况下它是从情节提要连接的奥特莱斯的可选选项。还有一个变量:

 var buttonOriginalWidth : CGFloat?

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

if let widthIsValid = buttonOriginalWidth 
   // use the widthIsValid here

如果您尝试使用变量而不强制解包应用程序,至少不会崩溃,例如执行类似的操作,它将像 Optional(478431) 一样打印它:

print(buttonOriginalWidth)

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

【讨论】:

【参考方案3】:

万一出风口,千万别回避

@IBOutlet var button : UIButton!

是有意的。如果代码崩溃,它会显示设计错误(未连接插座)。

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

var buttonOriginalWidth : CGFloat = 0.0

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

【讨论】:

以上是关于避免隐式展开变量的主要内容,如果未能解决你的问题,请参考以下文章

不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil

在 Swift 中,我如何避免选项和 nil 对象引用?

深入探究js中的隐式变量声明

C#中隐式类型本地变量var

数据类型转换

汤姆大叔的博客-编程正例