强制展开或使用可选链接设置属性

时间:2018-07-15 04:28:56

标签: swift forced-unwrapping optional-chaining

鉴于具有设置属性的可选var pinImageView: UIImageView?,我不确定设置该属性的首选方法。例如:

if let image = UIImage(named: "Pin") {
    pinImageView = UIImageView(image: image)
    pinImageView?.restorationIdentifier = "pin"
}

if let image = UIImage(named: "Pin") {
    pinImageView = UIImageView(image: image)
    pinImageView!.restorationIdentifier = "pin"
}

2 个答案:

答案 0 :(得分:1)

  

首选哪种方式

通常应该避免使用!强制展开),这只是乞求崩溃,因此应避免使用此方法:

if let image = UIImage(named: "Pin") {
    pinImageView = UIImageView(image: image)
    pinImageView!.restorationIdentifier = "pin"
}

在这种情况下,由于您刚刚分配了pinImageView,所以强制展开是安全的,但是它仍然会向您或以后读取您的代码的其他任何人发出危险信号。 “ U,他们在这里用力解包。会崩溃吗?好吧,pinImageViewnil吗?不,它只是在上一行中指定的,所以可以。”为什么要让自己和他人经历这种思考过程;尽可能避免使用!

此用法:

if let image = UIImage(named: "Pin") {
    pinImageView = UIImageView(image: image)
    pinImageView?.restorationIdentifier = "pin"
}

更安全,因为它使用可选链来解包pinImageView,并避免了 crash运算符 !,但它仍解开了可选变量。

第三种选择:

imageView是可选的原因是您已将其分配给可选变量。相反,如果在配置对象时使用let常量保存对象,则可以避免用解包代码填充代码:

if let image = UIImage(named: "Pin") {
    let imageView = UIImageView(image: image)
    imageView.restorationIdentifier = "pin"
    pinImageView = imageView
}

当您为对象分配许多属性时,此方法效果很好,因为可以避免许多展开运算符。

不用担心额外的代码行。编译器将对其进行优化。可读性和清晰度代码。

答案 1 :(得分:0)

我们的团队中有一条代码样式/审查规则,内容是“ <!没有使用!运算符,而没有说明其安全性的注释”。

因为!破坏了Swift中nil-safety的所有优点,随意使用它会导致崩溃,并将语言拖回C / C ++ / Java / C#/ Javascript / etc NullPointerException地狱。

所以在您的情况下

mysqli_query($con,"YOUR_QUERY");

选项绝对是首选。