我试图理解这个随机错误//快速

时间:2018-01-09 14:23:49

标签: swift exc-bad-instruction

class Personnage {
    var vie = arc4random_uniform(10) + 1;
    var force = arc4random_uniform(8) + 1;
    var chance = arc4random_uniform(2);
    func attaquePar(joueur1:Personnage) ->String {
        var differenceForce = self.force - joueur1.force
        var coup = differenceForce + chance
        if coup >= self.vie {
            return "tu mas eu"
        } else if coup < self.vie {
            self.vie = self.vie - coup
            return "jai rien senti macaque \(self.vie)"
        } else {
            return "heu?"
        }
}
}
let toto = Personnage()
let cafard = Personnage()
toto.attaquePar(cafard)

嗨,我在第6行收到错误消息。它有效,有些则没有。这是:执行被中断,原因是EXC_BAD_INSTRUCTION(代码= EXC I386_INVOP子代码= 0x0)。 我想有一个无效的操作,但我并不喜欢为什么我得到这个。

2 个答案:

答案 0 :(得分:1)

arc4random_uniform()的返回类型是UInt32,还有计算 差异

var differenceForce = self.force - joueur1.force

将以运行时异常中止第二个操作数更大 第一个操作数,即结果不能表示为(无符号)UInt32。与其他一些不同 编程语言,结果不会隐式提升为Int 或缠绕。

一个简单的例子:

let a = UInt32(3)
let b = UInt32(5)
let c = a - b // 

一种可能的解决方案是全部转换 数字为Int,以便可以毫无问题地计算差异:

var vie = Int(arc4random_uniform(10)) + 1
var force = Int(arc4random_uniform(8)) + 1
// etc 

答案 1 :(得分:0)

谢谢马丁。你是完全正确的。

将变量类型从UInt32转换为Int是解决方案。

var life = arc4random_uniform(10) 
var life = int(arc4random_uniform(10))