プロトコルは、準拠する型が特定のインスタンスメソッドやタイプメソッドを実装するよう要求することができます。これらのメソッドをプロトコルの定義の一部として、通常のインスタンスメソッドやタイプメソッドとまったく同じように記述しますが、波括弧やメソッド本体は除きます。可変長パラメータを、通常のメソッドと同じ規則で利用することができます。一方で、プロトコルの定義内のメソッドパラメータにデフォルト値を指定することはできません。

タイププロパティ要件と同様に、プロトコルにタイプメソッド要件を定義するときには、常に static キーワードを前に付けます。これは、タイプメソッド要件がクラスで実装されるときにも同様で、class または static キーワードを前に付けます。

protocol SomeProtocol {
    static func someTypeMethod()
}

次の例では、インスタンスメソッド要件が 1 つのプロトコルを定義しています。

protocol RandomNumberGenerator {
    func random() -> Double
}

このプロトコル RandomNumberGenerator は、呼びだされたときに Double 値を返すインスタンスメソッド random を、準拠する型が持つことを要求します。プロトコルで指定されてはいませんが、この値は 0.0 から 1.0 まで(ただし含まない)の数値と仮定されます。

RandomNumberGenerator プロトコルは、ランダムな数値がどのように生成されるかについて何も仮定していません。単に、ランダムな数値を生成する標準的な方法を提供することを要求しています。

次の例は、RandomNumberGenerator プロトコルを採用し、準拠するクラスの実装です。このクラスは、線形合同法として知られる擬似乱数生成器を実装しています。

class LinearCongruentialGenerator: RandomNumberGenerator {
    var lastRandom = 42.0
    let m = 139968.0
    let a = 3877.0
    let c = 29573.0
    func random() -> Double {
        lastRandom = ((lastRandom * a + c) % m)
        return lastRandom / m
    }
}
let generator = LinearCongruentialGenerator()
print("Here's a random number: \(generator.random())")
// "Here's a random number: 0.37464991998171" と出力
print("And another one: \(generator.random())")
// "And another one: 0.729023776863283" と出力

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.