2016-11-02 5 views
1

私はXcode 7.3とSwift 2.3を使用しています。変数を持つ関連型のプロトコルを使用するのは難しいです。例を見てください:関連するタイプのプロトコルの汎用変数。バグ?

protocol SomeProtocol {} 
class SomeProtocolImpl: SomeProtocol {} 

protocol ProtocolWithAssociatedType { 
    associatedtype T: SomeProtocol 

    var variable: T { get } 
} 

class TestClass: ProtocolWithAssociatedType { 

    var variable: SomeProtocol = SomeProtocolImpl() 

} 

何らかの理由で、コンパイラはエラーを示しています error image 可能ということですどのように?私は何か間違っているのですか?バグですか?既知のもの?私が試した何

:その関連付けられているタイプの

定義さtypealias:

class TestClass: ProtocolWithAssociatedType { 
    typealias O = SomeProtocol 
    var variable: SomeProtocol = SomeProtocolImpl() 
} 

いいえ。

代わりにメソッドを使用します:

protocol SomeProtocol {} 
class SomeProtocolImpl: SomeProtocol {} 

protocol ProtocolWithAssociatedType { 
    associatedtype T: SomeProtocol 

    func someMethod() -> T 
} 

class TestClass: ProtocolWithAssociatedType { 
    typealias T = SomeProtocol 

    func someMethod() -> SomeProtocol { 
     return SomeProtocolImpl() 
    } 

} 

はちょうど別のエラーを得た: second error image

はどのようにして、関連するタイプと変数とのプロトコルを作成し、このエラーを回避する必要がありますか?

+0

@Hamishええ、確かに、あなたは正しい –

答えて

1

コンパイラには、SomeProtocolに準拠するTの特定のタイプが必要です。この行が正しい見えますが

var variable: SomeProtocol 

コンパイラがに実行されている問題は、それがプロトコルだ、SomeProtocolがタイプではないということです。

最も簡単な解決策は、

var variable: SomeProtocolImpl = SomeProtocolImpl() 

を使用するか、またはちょうどそれが自分自身をそれを把握できるようにコンパイラに種類を教えてください。

var variable = SomeProtocolImpl() 
+0

あなたの説明は正しいですが、 'コンパイラはSomeProtocol'に準拠Tのための特定のタイプを必要とする理由私はまだ理解できません。何か理由はありますか?それはちょうど一時的なコンパイルの制限ですか? –

+0

残念ながら、あなたの答えは私の問題を解決しません - 私はまだこの変数をカプセル化を維持し、具体的な実装に頼るのを避けるためのプロトコルとして宣言する必要があります。 –

+0

次に、関連するタイプを使用しないようにプロトコルを変更する必要があります。 'var変数:SomeProtocol {get} ' –

関連する問題