0
実世界のコードから、次の不自然スウィフト2の例では、コンパイルされません。Swiftでジェネリック型プロトコルの準拠をどのように構成しますか?
protocol SomeModelType { }
protocol SomeProtocol {
var someVar: SomeModelType? { get }
}
class ConcreteClass<T: SomeModelType>: SomeProtocol {
var someVar: T?
}
は、これは完全に私には意味がありません。私はT
がSomeModelType
に拘束されており、someVar
プロパティのバッキングタイプとしてT
を持っているので、コンパイラはSomeProtocol
がConcreteClass
によって適合されていたことを把握することができるだろうというConcreteClass
で引き受けます。
このような例はどのように構成する必要がありますか? Swiftコンパイラは、ジェネリック型の制約を使用してプロトコルの適合性を判断することは可能ですか?
関連(可能デュープ?):[スウィフト:?どのように私は、サブクラスの戻り値の型を持つ関数を作ることができるスーパークラスは、戻り値の型として定義されたプロトコルに準拠](のhttp:// stackoverflowの.com/questions/35094967/sudo-how-can-make-a-function-with-subclass-return-type-a-protoc)あなたの問題はジェネリックとはほとんど関係ありません。 (リンクされたQ&Aが言っているように)プロトコル要件が不変な形で満たされなければならないという事実のために、抽象的な型要件を満たすことができません。 – Hamish
これは直感的ではないように思えるかもしれませんが、プロトコルに準拠するための共変行動を許可することは、反変的な関係(例えば、プロパティー・セッターとメソッド入力)で壊れることに注意してください。 'ConcreteClass'を 'SomeProtocol'にキャストすることは、' SomeModelType'に準拠した* anything *が以前は具体的な型を持つパラメータに入力されることを許してしまいます。 –
Hamish