下面是我的协议ICRUDOperation
public protocol ICRUDOperation {
associatedtype T
func insert(data:T)
func update(data:T)
func get(data:T) -> [T]
func getList(data: BaseModel) -> [T]
func getPage(data: BaseModel) -> [T]
func delete(data: T)
}
我试着在下面使用它:
func delegate1<W>(sqlite: W, service: W, data: W.T) where W: ICRUDOperation {
sqlite.insert(data: data)
}
var decision = [String : [String:((ICRUDOperation, ICRUDOperation, T) ->())?]]()
func fillDecision() {
decision["Person"]?["1"] = Delegate1
}
我在决定中得到了这个错误
Protocol 'ICRUDOperation' can only be used as a generic constraint because it has Self or associated type requirements
fillDecision()
的错误
Cannot assign value of type '(_, _, _.T) -> ()' to type '((ICRUDOperation, ICRUDOperation, _) -> ())??'
发布于 2019-04-10 03:59:46
一旦你添加了相关的类型,就不再有"ICRUDOperation“这样的东西了。PAT (具有关联类型的协议)没有存在形式;它的存在是为了将方法附加到其他类型,或者限制可以传递给泛型函数的具体类型。不能将PAT存储在变量、字典或其他任何地方。协议(以及PAT)不是抽象类。
要理解的最关键的一点是,关联的类型是由实现选择的,而不是由调用者选择的。因此,在您的示例中,数组将通过ICRUDOperation的实现来选择T
(就像数组将其Collection.Index选择为Int一样;您不能选择它)。泛型允许调用者选择类型,这看起来更像是您要实现的目标。
您如何解决这个问题取决于您的用例,这很难从您的示例中理解。
如果您能演示您期望的两个或三个不同的ICRUDOperation实现会是什么样子,这将是很有帮助的。我不确定你想说的“一个操作的实现”是什么意思。
https://stackoverflow.com/questions/55599233
复制相似问题