協(xié)議本身不實(shí)現(xiàn)任何功能,但你可以將它當(dāng)做類型來(lái)使用。
使用場(chǎng)景:
注意: 協(xié)議類型應(yīng)與其他類型(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
}
}
這里定義了一個(gè)名為 Dice的類,用來(lái)代表桌游中的N個(gè)面的骰子。
Dice含有sides和generator兩個(gè)屬性,前者用來(lái)表示骰子有幾個(gè)面,后者為骰子提供一個(gè)隨機(jī)數(shù)生成器。由于后者為RandomNumberGenerator的協(xié)議類型。所以它能夠被賦值為任意遵循該協(xié)議的類型。
此外,使用構(gòu)造器(init)來(lái)代替之前版本中的setup操作。構(gòu)造器中含有一個(gè)名為generator,類型為RandomNumberGenerator的形參,使得它可以接收任意遵循RandomNumberGenerator協(xié)議的類型。
roll方法用來(lái)模擬骰子的面值。它先使用generator的random方法來(lái)創(chuàng)建一個(gè)[0-1]區(qū)間內(nèi)的隨機(jī)數(shù)種子,然后加工這個(gè)隨機(jī)數(shù)種子生成骰子的面值。
如下所示,LinearCongruentialGenerator的實(shí)例作為隨機(jī)數(shù)生成器傳入Dice的構(gòu)造器
var d6 = Dice(sides: 6,generator: LinearCongruentialGenerator())
for _ in 1...5 {
println("Random dice roll is \(d6.roll())")
}
//輸出結(jié)果
//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