1

给定一个具有已设置属性的可选 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"
}
4

2 回答 2

2

首选哪种方式

人们普遍认为您应该避免!强制展开)这只是乞求崩溃,所以应该避免这种使用:

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

在这种情况下,由于您刚刚分配了pinImageView,因此强制展开它是安全的,它仍然会向您或将来阅读您的代码的任何其他人提出危险信号。“呃,他们在这里使用强制展开。那会崩溃吗?嗯,可能pinImageViewnil?不,它只是在上一行中分配的,所以没关系。” 为什么要让自己和他人经历这个思考过程?!尽可能避免。

这种用法:

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

更安全,因为它使用可选链解包pinImageView并避免崩溃操作符 !,但它仍然解包可选变量。

第三种选择:

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

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

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

不用担心额外的代码行。编译器会优化它。代码的可读性和清晰度。

于 2018-07-15T10:39:26.797 回答
0

我们的团队中有一个代码样式/审查规则,类似于“使用 ! 操作符而没有说明其安全原因的注释”。

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

所以在你的情况下

pinImageView?.restorationIdentifier = "pin"

选项肯定是首选。

于 2018-07-15T12:27:45.377 回答