Swift 是否将泛型类型与协议和关联类型一起使用?

Swift 是否将泛型类型与协议和关联类型一起使用?,swift,generics,associated-types,Swift,Generics,Associated Types,我试图创建一个类,它可以描述为a)保留某个类型的属性,例如T,并保留另一个类型的属性,以更新同一类型的属性T。我认为通过我的(非工作)示例可以更好地解释这一点: protocol Updater { associatedtype UpdateType func update(withSuccess success: ((UpdateType) -> Void)?, failure: ((NSError) -> Void)?) } class MyContaine

我试图创建一个类,它可以描述为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更新类型
func更新(成功:((UpdateType)->Void)?,失败:((NSError)->Void)?)
}
类霉菌容器{
私有(集合)变量对象:T
私有(集合)变量更新程序:更新程序
}
在上面的示例中,我希望确保协议的
associatedtype
myContainer的泛型类型匹配

这可以在swift中实现吗


坦斯克

您不能拥有
更新程序类型的属性。那是抽象的。您需要使用它来约束具体类型(在本例中为
U

Updater
当然可以包装一个
更新(withSuccess:withFailure:)
方法,但在实践中,以这种方式拆分它通常更好

class MyContainer<T, U: Updater> where U.UpdateType == T {
    private(set) var object: T
    private(set) var updater: U
}
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>
}