我写了一个简单的Bag类。袋子中装有固定比例的温度枚举。它使您可以随机抓取一个,并在装满后自动自动装满。看起来像这样:
class Bag { var items = Temperature[]() init () { refill() } func grab()-> Temperature { if items.isEmpty { refill() } var i = Int(arc4random()) % items.count return items.removeAtIndex(i) } func refill() { items.append(.Normal) items.append(.Hot) items.append(.Hot) items.append(.Cold) items.append(.Cold) } }
温度枚举看起来像这样:
enum Temperature: Int { case Normal, Hot, Cold }
我GameScene:SKScene有一个常量实例属性bag:Bag。(我也尝试过使用变量。)当我需要一个新的温度时,调用bag.grab()一次didMoveToView,在合适的时候调用touchesEnded。
GameScene:SKScene
bag:Bag
bag.grab()
didMoveToView
touchesEnded
此呼叫随机地在中的if items.isEmpty行崩溃Bag.grab()。错误是EXC_BAD_INSTRUCTION。检查调试器是否显示项目is size=1和[0] = (AppName.Temperature) <invalid> (0x10)。
if items.isEmpty
Bag.grab()
EXC_BAD_INSTRUCTION
size=1
[0] = (AppName.Temperature) <invalid> (0x10)
编辑 好像我不了解调试器信息。即使有效的数组也会显示size=1和无关的值[0] =。所以没有帮助。
[0] =
我无法让它在操场上崩溃。这可能很明显,但我很困惑。
函数arc4random返回UInt32。如果获得的值大于Int.max,则转换Int(...)将崩溃。
arc4random
UInt32
Int.max
Int(...)
使用
Int(arc4random_uniform(UInt32(items.count)))
应该是一个更好的解决方案。
(责怪Alpha版本中奇怪的崩溃消息…)