在Swift中检查null的正确方法是什么?

时间:2014-11-12 17:02:32

标签: ios objective-c swift

我应该重构这一行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 {
    }
}

请让我知道哪种方式更合适/更正确。

提前致谢!

2 个答案:

答案 0 :(得分:2)

我会使用以下内容:

if self.currentImageFrame?.isSaveToLibrary == true {
    // Stuff
}

你的var currentImageFrame是?因此,您不必检查它是否为零,如果为零,则不会检查是否为条件,如果它不是零则会检查是否为如果条件满足,它将进入。此外,您不需要在Swift中使用括号:)

答案 1 :(得分:1)

由于self.currentImageFrame是一个可选,所以更简洁的方式就是利用可选链接的工作原理:

if self.currentImageFrame?.isSaveToLibrary == false
{
    // Code
}

如果self.currentImageFrame不是nilself.currentImageFrame?.isSaveToLibrary将返回isSaveToLibrary的值。

如果self.currentImageFramenil,则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 } } ,因为它在语法上不正确,其含义不明确。我会将其命名为isSaveToLibrarywasSavedToLibrary,具体取决于预期用途。