1
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 (code=EXC I386_INVOP subcode=0x0)。我想有一个无效的操作,但我不明白为什么我得到这个。

4

2 回答 2

1

arc4random_uniform()来自is的返回类型UInt32,并计算差异

var differenceForce = self.force - joueur1.force

第二个操作数大于第一个操作数时,将中止运行时异常,即结果不能表示为 (unsigned) 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 
于 2018-01-09T14:31:38.083 回答
0

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

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

var life = arc4random_uniform(10) 
var life = int(arc4random_uniform(10)) 
于 2018-01-09T19:12:41.793 回答