我有两个属性。其中一个是可选的。这些定义如下:
var advertiseCompleteBlock: (() -> ())!
var isAdvertiser: Bool = false;
现在,如果我尝试在下面的代码中使用它,编译器会在构建时抛出错误并因错误代码254而失败。
if (self.isAdvertiser && self.advertiseCompleteBlock) {
self.advertiseCompleteBlock();
}
但如果我改变它如下,它可以正常工作:
if (self.isAdvertiser && self.advertiseCompleteBlock) {
if (self.advertiseCompleteBlock) {
self.advertiseCompleteBlock();
}
}
任何人都可以解释这两个代码块是如何不同的,我在这里做错了什么?
答案 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然后调用块,因此在这种情况下编译器很高兴。