プロトコルにプロパティを定義する
protocol プロトコル名{ var プロパティ名 : 型名{get} //ゲッターのみ必要 } protocol プロトコル名{ var プロパティ名 : 型名{get set} //ゲッターとセッターが必要 }
プロトコルにプロパティを定義する場合上記のようにプロパティ名・型名・ゲッターとセッターの有無を定義します。
プロパティは常にvarキーワードで宣言します。
(プロパティの実装を要求する)プロトコルに準拠する
プロトコルは、準拠する型(sample1では構造体)に対して実装を要求します。
準拠する型が、プロトコルが要求するプロパティを実装する方法、つまりプロトコルに準拠する方法が以下です。
sample1
protocol ProtocolA{ var prop:Int{get} } struct StructA:ProtocolA{ var prop:Int //←変数のストアドプロパティ } struct StructB:ProtocolA{ let prop:Int //←定数のストアドプロパティ } struct StructC:ProtocolA{ var prop:Int{ //コンピューテドプロパティ return 3 } } let stA=StructA(prop:1) let stB=StructB(prop:2) let stC=StructC() print(stA.prop) print(stB.prop) print(stC.prop)
1
2
3
sample1では、propという名のInt型のプロパティの実装を要求するProtocolAプロトコルを定義しています。
そしてProtocolAに準拠する3つの構造体StructA,StructB,StructCを定義しています。
ProtocolA内でプロパティpropはゲッターのみ要求されており、ゲッターのみのプロパティを実装する方法は上記のように3種類あります。
(1)変数のストアドプロパティとして実装する(ProtocolA)
(2)定数のストアドプロパティとして実装する(ProtocolB)
(3)ゲッターを持つコンピューテドプロパティとして実装する(ProtocolC)
なおStructA,StructBにはイニシャライザが定義されていませんが、構造体の場合プログラマーがイニシャライザの定義を記述しないと、自動的にメンバワイズイニシャライザが内部的に用意されますので、上記のようなイニシャライザでの引数指定(19行目,20行目)で、プロパティの初期化(プロパティpropに引数として渡した値をセットする)を行うことができます。