2017-11-06 11 views
0

私はAPI結果ハンドリングのための汎用データ構造を作成しています。オンラインで読むことができました。プロトコルと関連タイプを使用するのが最善であることが分かりました。これはこれまでの私の実装です。別のプロトコル関数の引数としてSwiftプロトコルを渡します。

protocol CreateDataCallback { 
    associatedtype E 
    func onSuccess(e:E) -> Void 
    func onFail() -> Void 
} 

protocol DataSource: class { 
    associatedtype T 
    func getData<GDC:GetDataCallback>(id:ID, callback:GDC) -> Void 
} 

コードスニペットからわかるように、私のgetData関数は正しく書かれていません。問題は、DataSourceプロトコルからCreateDataCallbackプロトコルの 'associatedtype E'に 'associatedtype T'を渡す方法がわかりません。私はプロトコルDataSourceの拡張を書くことができましたが、それは一般的ではありません。これは即時にも可能ですか(私は今Javaで可能です)、もし可能であれば、私にその方法を教えてください。 Thx

答えて

1

私はGDCにDataSourceの関連タイプを作って、GDCをCreateDataCallBackに準拠させると思います。そして、あなたが関連付けられているタイプTを必要としない、あなただけのGDC.E

protocol DataSource: class{ 
    associatedtype GDC: CreateDataCallback 
    func getData(id:GDC.E, callback:GDC) -> Void 
} 

を参照することができますここでは2つのプロトコルのいくつかの実装です:

class Bar: CreateDataCallback 
{ 
    func onSuccess(e: Int) { 
     // code 
    } 

    func onFail() { 
     // code 
    } 
    typealias E = Int 
} 

class Foo: DataSource 
{ 
    typealias GDC = Bar // This makes GDC.E a typealias for Int 

    func getData(id: Int, callback: Bar) { 
     // code 
    } 
} 
関連する問題