在 Swift 中,我有一个计时器。每隔一秒,屏幕上的点变为不同的点图像。它选择随机显示的点。这就是我想要的。应用程序在启动时崩溃。就像,马上。这次崩溃是如何解决的?此外,在那之后,它将与我当前的代码一起使用吗?在评论了一些内容并进行测试后,导致它的行是imageNumber = Int(arc4random())%13
。这是如何解决的?
我的代码如下:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var dotChangingTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("changeDot"), userInfo: nil, repeats: true)
var theRandomImages: UIImage[] = [dotOne, dotTwo, dotThree, dotFour, dotFive, dotSix, dotSeven, dotEight, dotNine, dotTen, dotEleven, dotTwelve, dotThirteen]
openingScreenDynamicDot = theRandomImages[Int(imageNumber)]
let finalChangingDotWelcomePage = UIImageView(image: openingScreenDynamicDot)
finalChangingDotWelcomePage.frame = CGRectMake(110, 234, 100, 100)
}
func changeDot() {
println("the images should be changing...")
imageNumber = Int(arc4random())%13
var theRandomImages: UIImage[] = [dotOne, dotTwo, dotThree, dotFour, dotFive, dotSix, dotSeven, dotEight, dotNine, dotTen, dotEleven, dotTwelve, dotThirteen]
openingScreenDynamicDot = theRandomImages[(imageNumber)]
}
答案 0 :(得分:2)
您正在尝试将UInt32
值转换为Int
,而不考虑检查范围。由于UInt32
是无符号的,因此arc4random()
的可能返回值的一半将超出Int
的范围,并且当您尝试强制转换时,您将收到运行时错误。做你正在做的事情的安全方法是先取模数和,然后转换为Int
:
imageNumber = Int(arc4random() % 13)
然而,这引入了模偏差,这会影响结果的随机性,所以你最好用:
imageNumber = Int(arc4random_uniform(13))
这两种方法都会为您提供0到12之间的随机值。
答案 1 :(得分:1)
我与arc4random()发生了类似的神秘崩溃,并通过切换到arc4random_uniform()来解决它。
试试这个:
imageNumber = Int(arc4random_uniform(13))