在IF语句中使用Swift可选的逻辑AND

时间:2014-07-24 22:56:53

标签: ios swift optional

我有两个属性。其中一个是可选的。这些定义如下:

var advertiseCompleteBlock: (() -> ())!
var isAdvertiser: Bool = false;

现在,如果我尝试在下面的代码中使用它,编译器会在构建时抛出错误并因错误代码254而失败。

if (self.isAdvertiser && self.advertiseCompleteBlock) {
    self.advertiseCompleteBlock();
}

但如果我改变它如下,它可以正常工作:

if (self.isAdvertiser && self.advertiseCompleteBlock) {
    if (self.advertiseCompleteBlock) {
         self.advertiseCompleteBlock();
    }
 }

任何人都可以解释这两个代码块是如何不同的,我在这里做错了什么?

2 个答案:

答案 0 :(得分:-1)

如果advertiseCompleteBlock真的是可选的,它可能应该用?声明?代替 !这说它永远存在。

我将原始代码作为一个简单的函数放在测试文件中,并删除了对self的引用,并且编译得很好。我不知道错误254会是什么。

这段代码真的是你想要的吗?

var advertiseCompleteBlock: (() -> ())?  --> really optional
var isAdvertiser: Bool = false;

if (isAdvertiser && advertiseCompleteBlock) {
    advertiseCompleteBlock!();    --> but now guaranteed
}

答案 1 :(得分:-2)

您的block var是可选的,未初始化。因此,虽然解包它肯定会是编译器不期望的nil。这就是你得到编译错误的原因。    在第二种情况下,您正在检查var是否为nil然后调用块,因此在这种情况下编译器很高兴。