2016-10-28 9 views
0

実世界のコードから、次の不自然スウィフト2の例では、コンパイルされません。Swiftでジェネリック型プロトコルの準拠をどのように構成しますか?

protocol SomeModelType { } 

protocol SomeProtocol { 
    var someVar: SomeModelType? { get } 
} 

class ConcreteClass<T: SomeModelType>: SomeProtocol { 
    var someVar: T? 
} 

は、これは完全に私には意味がありません。私はTSomeModelTypeに拘束されており、someVarプロパティのバッキングタイプとしてTを持っているので、コンパイラはSomeProtocolConcreteClassによって適合されていたことを把握することができるだろうというConcreteClassで引き受けます。

このような例はどのように構成する必要がありますか? Swiftコンパイラは、ジェネリック型の制約を使用してプロトコルの適合性を判断することは可能ですか?

+0

関連(可能デュープ?):[スウィフト:?どのように私は、サブクラスの戻り値の型を持つ関数を作ることができるスーパークラスは、戻り値の型として定義されたプロトコルに準拠](のhttp:// stackoverflowの.com/questions/35094967/sudo-how-can-make-a-function-with-subclass-return-type-a-protoc)あなたの問題はジェネリックとはほとんど関係ありません。 (リンクされたQ&Aが言っているように)プロトコル要件が不変な形で満たされなければならないという事実のために、抽象的な型要件を満たすことができません。 – Hamish

+0

これは直感的ではないように思えるかもしれませんが、プロトコルに準拠するための共変行動を許可することは、反変的な関係(例えば、プロパティー・セッターとメソッド入力)で壊れることに注意してください。 'ConcreteClass 'を 'SomeProtocol'にキャストすることは、' SomeModelType'に準拠した* anything *が以前は具体的な型を持つパラメータに入力されることを許してしまいます。 – Hamish

答えて

0
protocol SomeModelType { } 

protocol SomeProtocol { 

    associatedtype T: Any 
    var someVar: T? { get } 
} 

class ConcreteClass<T> :SomeProtocol where T: SomeModelType { 

    var someVar: T? 

} 
関連する問題