プロトコルは、どのような機能もプロトコル自体に実装しません。それでも、作成したプロトコルはコードで使用するためのれっきとした型になります。
プロトコルが型であるため、以下を含め、他の型が使える多くの場面でプロトコルを使用することができます。
- 関数、メソッド、イニシャライザのパラメータの型、または戻り値の型として
- 定数、変数、プロパティの型として
- 配列、辞書、その他コンテナ内でのアイテムの型として
Int
や String
、Double
のような)他の型の名前に合わせ、プロトコルの名前を(FullyNamed
や RandomNumberGenerator
のように)大文字で始めます。
次は、型として使用されているプロトコルの例です。
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
}
}
この例では、ボードゲームで使用する n 面のサイコロを表現する新しいクラス Dice
を定義しています。Dice
インスタンスには、そのサイコロに何面あるかを表す整数のプロパティ sides
と、サイコロの出目をランダムに生成するプロパティ generator
があります。
generator
プロパティは RandomNumberGenerator
型です。従って、RandomNumberGenerator
プロトコルを採用するあらゆる型のインスタンスを、そのプロパティに設定することができます。このプロパティに代入するインスタンスの条件は、インスタンスが RandomeNumberGenerator
プロトコルを採用する必要があることを除いて、他にはありません。
また、Dice
には初期状態にセットアップするためのイニシャライザがあります。このイニシャライザにも、RandomNumberGenerator
型の generator
パラメータがあります。新しい Dice
インスタンスを初期化するときに、このパラメータに準拠する型の値を渡すことができます。
Dice
にはインスタンスメソッド roll
があり、1 とサイコロの面数の間にある整数値を返します。このメソッドは、0.0
と 1.0
の間の乱数を生成するために、ジェネレータの random()
メソッドを呼び出し、正しい範囲内の出目の値を生成するためにこの乱数を使用します。generator
が RandomNumberGenerator
を採用していることがわかっているため、呼び出す random()
メソッドがあることが保証されています。
次の例では、乱数ジェネレータに LinearCongruentialGenerator
インスタンスを利用して 6 面のサイコロを生成するために、Dice
クラスをどのように使用するかを示しています。
var d6 = Dice(sides: 6, generator: LinearCongruentialGenerator())
for _ in 1...5 {
print("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
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.