首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法在函数指针中设置协议的数据类型?

有没有办法在函数指针中设置协议的数据类型?
EN

Stack Overflow用户
提问于 2019-04-10 02:37:06
回答 1查看 64关注 0票数 0

下面是我的协议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, _) -> ())??'
EN

回答 1

Stack Overflow用户

发布于 2019-04-10 03:59:46

一旦你添加了相关的类型,就不再有"ICRUDOperation“这样的东西了。PAT (具有关联类型的协议)没有存在形式;它的存在是为了将方法附加到其他类型,或者限制可以传递给泛型函数的具体类型。不能将PAT存储在变量、字典或其他任何地方。协议(以及PAT)不是抽象类。

要理解的最关键的一点是,关联的类型是由实现选择的,而不是由调用者选择的。因此,在您的示例中,数组将通过ICRUDOperation的实现来选择T (就像数组将其Collection.Index选择为Int一样;您不能选择它)。泛型允许调用者选择类型,这看起来更像是您要实现的目标。

您如何解决这个问题取决于您的用例,这很难从您的示例中理解。

如果您能演示您期望的两个或三个不同的ICRUDOperation实现会是什么样子,这将是很有帮助的。我不确定你想说的“一个操作的实现”是什么意思。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55599233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档