プロトコルは、準拠する型が特定の名前と型を持つインスタンスプロパティやタイププロパティを提供するよう要求することができます。プロトコルは、プロパティがストアドプロパティかコンピューテッドプロパティかは指定せず、プロパティの名前と型だけを指定します。また、プロトコルは各プロパティが gettable か、gettable かつ settable かを指定します。

プロパティが gettable かつ settable であるようプロトコルが要求する場合、そのプロパティ要件を定数のストアドプロパティや、読み取り専用のコンピューテッドプロパティで満たすことはできません。プロパティが gettable であることだけをプロトコルが要求する場合には、どのようなプロパティででも要件を満たすことができ、役立つのであればそのプロパティを settable にすることも有効です。

プロパティ要件は、常に変数プロパティとして var キーワードを付けて宣言されます。型宣言の後に ( get set ) と記述して gettable かつ settable なプロパティを示し、{ get } と記述して gettable なプロパティを示します。

protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

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

protocol AnotherProtocol {
    static var someTypeProperty: Int { get set }
}

次の例は、インスタンスプロパティ要件が 1 つのプロトコルです。

protocol FullyNamed {
    var fullName: String { get }
}

FullyNamed プロトコルは、準拠する型がフルネームを提供するよう要求します。このプロトコルは、準拠する型の性質について他には何も指定しておらず、その型が自身のフルネームを提供する必要があることだけを指定しています。どの FullyNamed 型でも、String 型の gettable なインスタンスプロパティ fullName を持つ必要があることを示しています。

次の例は、FullyNamed プロトコルを採用し、準拠するシンプルな構造体です。

struct Person: FullyNamed {
    var fullName: String
}
let john = Person(fullName: "John Appleseed")
// john.fullName は "John Appleseed"

この例では、特定の名前を持つ人間を表現する構造体 Person を定義しています。定義の 1 行目で FullyNamed プロトコルを採用していることを示しています。

Person の各インスタンスは、String 型のストアドプロパティ fullName を持っています。これは FullyNamed プロトコルの要件にマッチしていて、Person が正しくそのプロトコルに準拠していることを意味しています。(プロトコル要件が満たされていない場合には、Swift はコンパイル時エラーを報告します。)

次はより複雑なクラスで、また FullyNamed プロトコルを採用し、準拠しています。

class Starship: FullyNamed {
    var prefix: String?
    var name: String
    init(name: String, prefix: String? = nil) {
        self.name = name
        self.prefix = prefix
    }
    var fullName: String {
        return (prefix != nil ? prefix! + " " : "") + name
    }
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName は "USS Enterprise"

このクラスは、読み取り専用のコンピューテッドプロパティとして fullName プロパティ要件を実装しています。Starship クラスの各インスタンスは、必須の name と任意の prefix を保持します。fullName プロパティは、prefix 値がある場合には、スターシップのフルネームを生成するためにその値を name の前に付けて使用します。


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.