初始化一组骰子 - 在 GKARC4RandomSource 上使用 dropValuesWithCount

Initialising a set of dice - using dropValuesWithCount on a GKARC4RandomSource

我正在 swift 2.0 中初始化一组骰子。 我已经用名称 (:String)、状态列表 (:[String]) 和面(状态数组的索引)(:[Int])[=15= 声明了一个 class 骰子]

根据 GameplayKit Framework Reference and in this short article by Erica Sadun 中的建议,我想删除我的 GKARC4RandomSource 的前 1024 个值以确保 "true" 随机性。

在我的 UIViewController 中,我设置了一个初始化?初始化我的骰子的函数

class IceDiceViewController: UIViewController {

    var Dice: [Die]
    var source : GKRandomSource

...

    required init?(coder aDecoder: NSCoder){
        Dice = [Die]()
        source = GKARC4RandomSource()

// call the init function to instantiate all variables
        super.init(coder: aDecoder)
//  now initialize two dice with states ["red","yellow","blue","black","green","multiple"]
        Dice.append(Die(name:"iceDie", states: ["red","yellow","blue","black","green","multiple"]))
        Dice.append(Die(name:"iceDie", states: ["big","med","small","bigmed","bigsmall","medsmall"]))
// and drop the first values of the ARC4 random source to ensure "true" randomness
        source.dropValuesWithCount(1024)

...

}

这甚至无法编译:最后一行 returns 一个错误:

Value of type GKRandomSource has no member dropValuesWithCount

我的代码在没有这一行的情况下也能正常工作,但我不太确定我在这里做错了什么,除了上面引用的链接外,我几乎找不到在网络上使用 Gameplay Kit 实现 Dice 的任何参考资料.

这是 source 声明类型的问题:

var source : GKRandomSource

因为你只告诉 Swift 它是一个 GKRandomSource,它只会让你调用在 class 上定义的方法(因此对所有子classes)。 dropValuesWithCount 方法仅在这些 subclass 之一上,因此您不能在静态类型不是 subclass 的变量上调用它。

即使当您开始调用该方法时该变量实际上包含一个正确类型的对象,编译器也无法真正知道这一点——它只知道声明的(和推断的)类型。

因此,您可以简单地声明 source 实际上是一个 GKARC4RandomSource,而不仅仅是一个 GKRandomSource:

var source : GKARC4RandomSource

但话又说回来,也许您希望代码的其他部分不知道它是哪个随机子 class,这样您就可以轻松切换随机数生成器而无需更改所有代码?好吧,有几种方法可以解决这个问题,但一个简单的方法可能是将它投射到你调用 ARC4-specific API:

的地方
(source as! GKARC4RandomSource).dropValuesWithCount(1024)