我正在尝试创建一个类,可以描述为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
这可以在swift中完成吗?
Thansk!
答案 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:)
方法,但在实践中将其拆分通常会更好。