2017-02-13 8 views
0

私は、a)特定の型のプロパティ(Tなど)を保持し、同じ型(T)を更新できる別の型のプロパティを保持していると記述できるクラスを作成しようとしています。私の(非作業)例:上記の例ではプロトコルと関連タイプの汎用タイプの使用

protocol Updater { 
    associatedtype UpdateType 
    func update(withSuccess success: ((UpdateType) -> Void)?, failure: ((NSError) -> Void)?) 
} 

class MyContainer<T> { 
    private(set) var object: T 
    private(set) var updater: Updater 
} 

、私は、プロトコルのassociatedtypemyContainer

のジェネリック型を迅速に行うことが可能です。この一致することを確認したいですか?

Thansk!

答えて

0

Updaterのプロパティを持つことはできません。それは抽象です。あなたは具体的なタイプ(この場合はU)を制約するためにそれを使う必要があります。

class MyContainer<T, U: Updater> where U.UpdateType == T { 
    private(set) var object: T 
    private(set) var updater: U 
} 

しかし、このアプローチは面倒なことがあります。 where U.UpdateType == T句は、多くの場合、MyContainerを使用するコードを繰り返し使用しています。

通常、ソリューションはタイプイレーサーです。当然の

struct Updater<T> { 
    var success: ((T) -> Void)? 
    var failure: ((NSError) -> Void)? 
} 

class MyContainer<T> { 
    private(set) var object: T 
    private(set) var updater: Updater<T> 
} 

Updaterではなく、単一のupdate(withSuccess:withFailure:)メソッドをラップすることができますが、この方法でそれを分割することは、多くの場合、実際には非常に良くある:むしろプロトコルよりも、閉鎖とジェネリックを使用します。

関連する問題