Swift 通用协议属性声明
假设我有一个关联类型为T的协议Swift 通用协议属性声明,swift,Swift,假设我有一个关联类型为T的协议 protocol Helper{ associatedtype T func help(_ item: T) } 在类中,我要声明一个属性 class Manager<T>{ let item: T? let helper: Helper<T> //Error: Cannot specialize non-generic type 'Helper' let anotherHelper: Helpe
protocol Helper{
associatedtype T
func help(_ item: T)
}
在类中,我要声明一个属性
class Manager<T>{
let item: T?
let helper: Helper<T>
//Error: Cannot specialize non-generic type 'Helper'
let anotherHelper: Helper
//Error: Protocol 'Helper' can only be used as a generic constraint because it has Self or associated type requirements
}
类管理器{
让项目:T?
让助手:助手
//错误:无法专门化非泛型类型“Helper”
让另一个助手:Helper
//错误:协议“Helper”只能用作泛型约束,因为它具有自身或关联的类型要求
}
如何声明和使用helper属性,使其强制符合helper协议的类的类型
我敢肯定,很多有Java/C或其他类似语言背景的人在尝试做类似事情时会陷入困境在这种情况下,你可以让
Manager
中的T
成为助手
:
class Manager<T> where T : Helper {
let item: T.T?
let helper: T
init(helper: T) {
self.helper = helper
item = nil
}
}
然后使用
Manager
您可能需要一个类型擦除器:
struct AnyHelper:Helper{
私人出租帮助函数:(T)->Void
init(helper:H),其中helper.T==T{
helpFunc=helper.help
}
函数帮助(uu项:T)
helpFunc(项目)
}
}
然后在课堂上使用类型橡皮擦:
类管理器{
让项目:T?
让助手:AnyHelper
init(item:T,helper:H),其中H.T==T{
self.item=项目
self.helper=AnyHelper(helper)
}
}
尽管这似乎解决了这个特殊情况,但它并没有回答这个问题。通常T是一个模型,助手是在模型上执行操作的消费者。执行此操作的代码是什么样子的?
class IntHelper : Helper {
typealias T = Int
// ...
}