2017-02-13 88 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 
} 

在上面的例子中,我想,以確保協議的associatedtype泛型類型的myContainer

匹配這可能在迅速做什麼?

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:)方法來代替,但它分裂了這個辦法是在實踐中往往更好。

相關問題