協(xié)議
本身不實(shí)現(xiàn)任何功能,但你可以將它當(dāng)做類型
來使用。
使用場(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
的類,用來代表桌游中的N個(gè)面的骰子。
Dice
含有sides
和generator
兩個(gè)屬性,前者用來表示骰子有幾個(gè)面,后者為骰子提供一個(gè)隨機(jī)數(shù)生成器。由于后者為RandomNumberGenerator
的協(xié)議類型。所以它能夠被賦值為任意遵循
該協(xié)議的類型。
此外,使用構(gòu)造器(init)
來代替之前版本中的setup
操作。構(gòu)造器中含有一個(gè)名為generator
,類型為RandomNumberGenerator
的形參,使得它可以接收任意遵循RandomNumberGenerator
協(xié)議的類型。
roll
方法用來模擬骰子的面值。它先使用generator
的random
方法來創(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