所以我一直在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
}
答案 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)
此致