iOS Swift类型对话数学导致应用程序崩溃

iOS Swift类型对话数学导致应用程序崩溃,ios,iphone,casting,type-conversion,swift,Ios,Iphone,Casting,Type Conversion,Swift,我有一段代码,可以将一个小的UIView作为子视图放置在一个随机的X坐标上 如果我把视图放在一个固定的位置,它会工作,但是当我计算随机位置时,我的应用程序崩溃了。代码如下: @IBOutlet var gameView : UIView let DROP_SIZE = CGSize(width: 40, height: 40) @IBAction func tap(sender : AnyObject) { self.drop() }

我有一段代码,可以将一个小的UIView作为子视图放置在一个随机的X坐标上

如果我把视图放在一个固定的位置,它会工作,但是当我计算随机位置时,我的应用程序崩溃了。代码如下:

    @IBOutlet var gameView : UIView
    let DROP_SIZE = CGSize(width: 40, height: 40)

    @IBAction func tap(sender : AnyObject) {
        self.drop()
    }

    func drop() {
        var frame = CGRect()
        frame.origin = CGPointZero
        frame.size = DROP_SIZE
        var x = Int(arc4random()) % Int(self.gameView.bounds.size.width) / Int(DROP_SIZE.width)
        frame.origin.x = CGFloat(x) * CGFloat(DROP_SIZE.width)
        var dropView: UIView = UIView(frame: frame)
        dropView.backgroundColor = randomColor()
        self.gameView.addSubview(dropView)

    }
每当调用self.drop时,我的应用程序就会崩溃

如果我注释掉var x&frame.origin.x,我的应用程序不会崩溃

所以我知道问题在于这两行代码:

var x = Int(arc4random()) % Int(self.gameView.bounds.size.width) / Int(DROP_SIZE.width)
frame.origin.x = CGFloat(x) * CGFloat(DROP_SIZE.width)
这些变量的铸造方式导致应用程序崩溃,因为如果我使用固定的x原点,例如frame.origin.x=100,那么应用程序就会按预期工作

更新:


因为arc4random返回UInt32,所以在尝试将其转换为Int时会溢出

我用这个来代替

var x = UInt32(arc4random()) % UInt32(self.gameView.bounds.size.width) / UInt32(DROP_SIZE.width)
frame.origin.x = CGFloat(x) * CGFloat(DROP_SIZE.width)
var x = UInt32(arc4random()) % UInt32(self.gameView.bounds.size.width) / UInt32(DROP_SIZE.width)
frame.origin.x = CGFloat(x) * CGFloat(DROP_SIZE.width)

因为arc4random返回UInt32,所以在尝试将其转换为Int时会溢出

我用这个来代替

var x = UInt32(arc4random()) % UInt32(self.gameView.bounds.size.width) / UInt32(DROP_SIZE.width)
frame.origin.x = CGFloat(x) * CGFloat(DROP_SIZE.width)
var x = UInt32(arc4random()) % UInt32(self.gameView.bounds.size.width) / UInt32(DROP_SIZE.width)
frame.origin.x = CGFloat(x) * CGFloat(DROP_SIZE.width)

此问题类似:

崩溃时是否有任何错误消息?我收到的错误突出显示self.drop,文本为:Thread 1:EXC\u BAD\u INSTRUCTIONcode=EXC+l386\u INVOP,subcode=0x0有趣的是,有时它会立即崩溃,有时,它在最初的几次点击中起作用,然后崩溃。arc4random的可能副本返回UInt32。有一半的时间它会溢出Int32并在强制边界检查时崩溃。请参阅链接副本。