发布于 2015-06-14 01:59:32 | 153 次阅读 | 评论: 0 | 来源: 网络整理
协议
本身不实现任何功能,但你可以将它当做类型
来使用。
使用场景:
注意: 协议类型应与其他类型(Int,Double,String)的写法相同,使用驼峰式。
class Dice {
let sides: Int
let generator: RandomNumberGenerator
init(sides: Int, generator: RandomNumberGenerator) {
self.sides = sides
self.generator = generator
}
func roll() -> Int {
return Int(generator.random() * Double(sides)) +1
}
}
这里定义了一个名为 Dice
的类,用来代表桌游中的N个面的骰子。
Dice
含有sides
和generator
两个属性,前者用来表示骰子有几个面,后者为骰子提供一个随机数生成器。由于后者为RandomNumberGenerator
的协议类型。所以它能够被赋值为任意遵循
该协议的类型。
此外,使用构造器(init)
来代替之前版本中的setup
操作。构造器中含有一个名为generator
,类型为RandomNumberGenerator
的形参,使得它可以接收任意遵循RandomNumberGenerator
协议的类型。
roll
方法用来模拟骰子的面值。它先使用generator
的random
方法来创建一个[0-1]区间内的随机数种子,然后加工这个随机数种子生成骰子的面值。
如下所示,LinearCongruentialGenerator
的实例作为随机数生成器传入Dice
的构造器
var d6 = Dice(sides: 6,generator: LinearCongruentialGenerator())
for _ in 1...5 {
println("Random dice roll is (d6.roll())")
}
//输出结果
//Random dice roll is 3
//Random dice roll is 5
//Random dice roll is 4
//Random dice roll is 5
//Random dice roll is 4