我应该重构这一行Objective-C代码:
if (_currentImageFrame && ![_currentImageFrame.isSaveToLibrary boolValue]) {}
我想到了实现这一目标的两种方法,但我不确定哪一种更好:
1)
if (self.currentImageFrame != nil) &&
(self.currentImageFrame?.isSaveToLibrary == false)
{
}
2)
if let frame = self.currentImageFrame {
if self.currentImageFrame?.isSaveToLibrary == true {
}
}
请让我知道哪种方式更合适/更正确。
提前致谢!
答案 0 :(得分:2)
我会使用以下内容:
if self.currentImageFrame?.isSaveToLibrary == true {
// Stuff
}
你的var currentImageFrame是?因此,您不必检查它是否为零,如果为零,则不会检查是否为条件,如果它不是零则会检查是否为如果条件满足,它将进入。此外,您不需要在Swift中使用括号:)
答案 1 :(得分:1)
由于self.currentImageFrame
是一个可选,所以更简洁的方式就是利用可选链接的工作原理:
if self.currentImageFrame?.isSaveToLibrary == false
{
// Code
}
如果self.currentImageFrame
不是nil
,self.currentImageFrame?.isSaveToLibrary
将返回isSaveToLibrary
的值。
如果self.currentImageFrame
为nil
,则self.currentImageFrame?.isSaveToLibrary
会立即返回nil
,而不会尝试执行?
之后的任何内容(无论如何)链条走得多深。)
nil
不等于false
(与Objective-C不同,在Swift中nil
只等于nil
而没有别的),因此nil == false
计算为{ {1}},因此代码的行为与您期望的一样。
请注意,您的1)选项可以使用,但它完全是多余的,因为根本不需要进行第一次检查。
我认为您的2)选项有拼写错误,您打算在false
处输入false
。修复拼写错误后它也可以正常工作(因为你实际上是在外部条件下再次使用可选链接),但是它在中使用可选绑定错误的方式,因为你不使用外部条件体内的约束常量true
。使用可选绑定的更正确(尽管也是多余的)方式将是。
frame
在这种情况下,您根本不使用可选链接。 (虽然我怀疑在两种情况下优化的编译代码都是相同的。)
最后,我建议您重命名if let frame = self.currentImageFrame
{
if frame.isSaveToLibrary == false
{
// Code
}
}
,因为它在语法上不正确,其含义不明确。我会将其命名为isSaveToLibrary
或wasSavedToLibrary
,具体取决于预期用途。