プロトコルは、どのような機能もプロトコル自体に実装しません。それでも、作成したプロトコルはコードで使用するためのれっきとした型になります。

プロトコルが型であるため、以下を含め、他の型が使える多くの場面でプロトコルを使用することができます。

  • 関数、メソッド、イニシャライザのパラメータの型、または戻り値の型として
  • 定数、変数、プロパティの型として
  • 配列、辞書、その他コンテナ内でのアイテムの型として
NOTE
プロトコルは型であるため、Swift での(Int や StringDouble のような)他の型の名前に合わせ、プロトコルの名前を(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.