2016-05-11 11 views
12

プロトコルで定義されたメソッドで戻り型共分散をサポートしないのはなぜですか?例:プロトコルメソッドの戻り型共分散

class Base { } 

class Derived : Base { } 

protocol Requirement { 
    var someVariable : Base { get } 
} 

struct MyStruct : Requirement{ 
let someVariable : Derived 
} 

コンパイラは、MyStructがプロトコル要件に準拠していないというエラーを発します。私が知る限り、MyStructはLSPのすべての要件を満たしていますので、Swiftではこれがなぜ許可されないのでしょうか?

答えて

0

あなたが持っている想像:

var requirement: Requirement? 

と、あなたはあなたの構造体を見れば、それが可能ではないでしょうBase

let myBaseInstance = Base() 
requirement.someVariable = myBaseInstance 

ベースのインスタンス以来、型の変数を割り当てますDerivedから継承しません。つまりで

、これは可能ではないでしょう(それは、プロトコルの定義によって可能でなければなりません):

var requirement: Requirement? = MyStruct() 
requirement.someVariable = myBaseInstance //error 

someVariableはタイプDerivedでなければなりませんので、あなたは、2行目でエラーを取得し、 myBaseInstanceのタイプはBaseで、Derivedに準拠していない可能性があります。

0

ここではコンテキストが重要なので、これで目的のものが得られるかどうかはわかりません。

私の答えはassociatedtypeです。

同じセットアップでスタート

class Base { } 
class Derived: Base { } 

この時、私はBaseのいくつかの種類でなければならないプロトコルでタイプを定義します。

protocol Requirement { 
    associatedtype KindOfBase: Base 
    var someVariable: KindOfBase { get } 
} 

これで、必要なものが得られます。

struct MyStruct: Requirement { 
    let someVariable: Derived 
} 

struct MyStruct2: Requirement { 
    let someVariable: Base 
}