我在Stack上看了很多其他同样的错误(致命错误:在展开一个Optional值时意外发现nil?),但是我不明白在我的场景中可能等于nil因为有在崩溃线上发生了很多事情。
实际的异常是"线程1:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0"它在下面指示的行上崩溃。我不确定Bool是否{{1 }}或plays
等于nil。当我点击Thread 1下的条形图时,另外3行会出现同样的错误。
这些后续行都涉及spot
函数,而isOccupied
函数又涉及一行。我认为我解决了第一个错误,其他人将被解决。
引入播放的代码块:
var plays = Dictionary<Int,Int>()
var done = false
var aiDeciding = false
错误在哪里:
func isOccupied(spot:Int)->(Bool) {
return Bool(plays[spot]!) //ERROR LINE
}
改为:
func isOccupied(spot:Int)->(Bool) {
if plays != nil {
return Bool(plays[spot]!)
}
else {
return false
}
}
答案 0 :(得分:3)
Dictionary
的下标函数将返回Optional
(在这种情况下为Int?
),而不管密钥类型如何。这是因为您可能正在申请一个不存在的密钥。来自docs:
因为可以请求没有值的键,a dictionary的下标返回字典的可选值 价值类型。
你想要做这样的事情:
func isOccupied(spot: Int) -> Bool {
if let doesPlay = plays[spot] {
return Bool(doesPlay)
} else {
return false // assuming that's a sane default
}
}