初始化一组骰子 - 在 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)
我正在 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)