Swift良好的编码实践:如果语句带有可选类型Bool

时间:2014-07-19 17:03:26

标签: ios swift logic xcode6

所以我一直在Swift中开发一个应用程序,今天我花了近一个小时来调试一个完全出乎意料的问题。这一切都来自下面的代码。

if (hero.isAI) { //isAI is a Bool

}

问题是这个if语句总是返回true。所以我想也许我在某处将isAI设置为true但最后我意识到我将isAI声明为可选类型,如下所示。

var isAI: Bool!

应该是什么时候

var isAI: Bool

这导致if语句不检查isAI是否为真,而是检查它是否包含值。

所以为了安全起见,我一定要写下像这样的if-statments

if (hero.isAI == true) { //isAI is a Bool

}

所以我的问题是,将来我有什么办法可以避免这个问题?(这个问题似乎非常危险,特别是在大型项目团队工作时)。 我是否应该明确地写出我的if-statment,我应该完全避免Bools的可选类型吗?

请注意,我在Xcode Beta 2中没有遇到此问题。当我升级到Xcode beta 3时出现了这个问题。我认为因为在Beta 2中,Apple通过检查其值而不是在if语句中处理隐式解包的Bool检查它是否包含值。

最后,下面是一个示例,其中if-statements运行给定一个可选的Bool,以更好地帮助人们理解问题。

let myBool: Bool! = false

if (myBool) {
    //Runs
}

if (myBool!) {
    //Won't Run
}

if (!myBool) {
    //Runs
}

if (myBool == true) {
    //Won't Run
}

3 个答案:

答案 0 :(得分:11)

这是SwiftInFlux回购中正在跟踪的已知问题,其中包含来自Chris Lattner on the Apple developer forums的引用。

  

任何符合的选项都存在此问题   LogicValue协议(例如嵌套选项,可选的bool,   等等)。我们认为这个问题需要针对1.0和1.0进行修复   有一些想法,但尚未确定解决方案。

因此,这个问题并不仅仅影响可选的Bools,而是符合LogicValue协议(定义为)的任何可选类型。

protocol LogicValue {
    func getLogicValue() -> Bool
}

无论如何,就如何解决这个问题的建议而言,考虑到Apple没有给出他们将来如何解决这个问题的指示,很难推荐任何一个特定的解决方案,但我想,继续明确检查Bool的价值将是最佳选择。

if (hero.isAI == true) {
    // stuff    
}

事实上,在进一步阅读之后,上面列出的引用仍然是:

  

对于这种常见情况,最简单的答案是产生一个   警告"如果x"并要求某人明确写下"如果x!=   零"或者"如果x == true"明确他们想要的东西。

答案 1 :(得分:3)

我的建议是使用这个漂亮的合并??

if textfieldDate.text?.isEmpty ?? true {
    // the text is either nil or empty but its all we want to know
}

答案 2 :(得分:0)

如果bool是Core Data(又名NSNumber)的一部分,你应该这样做。

if (isHero.isAI?.boolValue != nil)

此致