使用具有协议和关联类型的通用类型?

时间:2017-02-13 02:04:43

标签: swift generics associated-types

我正在尝试创建一个类,可以描述为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

的泛型类型相匹配

这可以在swift中完成吗?

Thansk!

1 个答案:

答案 0 :(得分: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:)方法,但在实践中将其拆分通常会更好。