Swift でプロトコルと拡張機能を活用しようとしていますが、理解できないコンパイル エラーが発生します。
次のような Shape を定義する 2 つのプロトコルを宣言するとします。
protocol Shape {
var sides : Int { get }
var fill : Fill { get }
}
protocol Fill {
var color : UIColor { get }
}
これを実装するために、1 つは Square 用、もう 1 つはソリッド フィル用の 2 つの構造体を定義します。このような:
struct SolidFill : Fill {
var color : UIColor
}
struct Square : Shape {
var sides : Int = 4
var fill : SolidFill = SolidFill(color: UIColor.blackColor())
}
「タイプ 'Square' はプロトコル 'Shape' に準拠していません」というコンパイル エラーが表示されます。var fill : Fill
コンパイルエラーのように塗りつぶしのタイプを強制的に塗りつぶすと、消えます。プロトコルで許可されているものよりも具体的なタイプを Square で指定できないのはなぜですか?
この特定の例では、塗りつぶしに Enum を使用するか、何か他のものを作り直すことで、このパターンを使用しないように変更できることに気付きました。fill をプロトコルに準拠した型にすることができない理由を知りたいだけです。