gpt4 book ai didi

random - Swift 数组访问触发 EXC_BREAKPOINT

转载 作者:搜寻专家 更新时间:2023-10-31 22:03:53 25 4
gpt4 key购买 nike

这是我的代码(largeAsteroids.count 永远不会为 0):

var largeAsteroids=[[SKTexture]]()
func randomLargeAsteroidTextures()->Array<SKTexture>{
let i=Int(arc4random())%largeAsteroids.count
return largeAsteroids[i]// this line triggers EXC_BREAKPOINT
}

当我执行我的代码时,我没有收到任何错误,但我收到了一个 EXC_BREAKPOINT。我确保没有任何断点,并且在索引 i 处有一个有效对象。 enter image description here

首先我将 SKTexture 更改为 AnyObject,它没有帮助。然后我尝试使用 NSMutableArray 而不是 swift 数组,问题仍然存在:

var largeAsteroids=NSMutableArray()
func randomLargeAsteroidTextures()->AnyObject{
let i=Int(arc4random())%largeAsteroids.count
return largeAsteroids.objectAtIndex(i) // this line triggers EXC_BREAKPOINT
}

更新:

问题解决了,替换:

let i=Int(arc4random())%largeAsteroids.count

通过:

let i=Int(arc4random_uniform(UInt32(largeAsteroids.count)))

感谢马特的解决方案:

You should probably be using arc4random_uniform. You'll get modulo bias from your current implementation. – Matt Gibson

最佳答案

您在 32 位目标上运行,是吗?在 32 位目标(例如 iPhone 4)上,Swift Int 是 32 位的,并且是有符号的。但是,在任何平台上,arc4random() 都会返回一个 32 位无符号整数。

由于这种冲突,以及您对 Int 的转换,Int(arc4random()),有时——事实上,在其他情况相同的情况下,有一半的时间——你的数字是负数,给你一个负数组索引,并导致你的问题(尽管我得到 EXC_BAD_INSTRUCTION,正如我所料,当我重现问题时;大概你为异常设置了断点?)

我的建议是使用 arc4random_uniform,只要你的小行星数量在 32 位平台上不超过 Int.max 就应该可以正常工作,这大概不太可能,除非你给你的游戏玩家 < em>真的很艰难。它还将避免随机生成中的模偏差,因此生成的随机数将比原始解决方案中的分布更均匀。

关于random - Swift 数组访问触发 EXC_BREAKPOINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25154472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com