我正在尝试创建一个可以描述为以下类的类: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的通用类型匹配

这可以迅速做到吗?

谢谢!

最佳答案

您不能具有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:)方法,但是在实践中以这种方式拆分通常会更好。

10-08 09:13