gpt4 book ai didi

Swift:在面向协议(protocol)的方法中出错。错误:无法将类型 'I.Job' 的返回表达式转换为返回类型 'ActualJob'

转载 作者:可可西里 更新时间:2023-11-01 01:08:33 25 4
gpt4 key购买 nike

我有两个接口(interface) ControllerableInteractorable 应该一起工作来实现一些东西。以下是协议(protocol):

protocol Controllerable {
associatedtype Job: Decodable
func getJob() -> Job
func control(job: Job)
}

protocol Interactorable {
associatedtype Job: Decodable
func interact() -> Job
}

以下是符合上述协议(protocol)的具体类型:这里要注意一件事,Controller 有一个 Interactor 依赖项来使事情正常进行。

struct ActualJob: Decodable {
var id: String
}

class Controller<I: Interactorable>: Controllerable {
typealias Job = ActualJob
private var interactor: I

init(interactor: I) {
self.interactor = interactor
}

// MARK: Controllerable
func control(job: ActualJob) {
print("Controlling job: \(job.id)")
}

func getJob() -> ActualJob {
return interactor.interact() //***** Line of contention ****
}
}

class Interactor: Interactorable {
typealias Job = ActualJob

// MARK: Interactorable
func interact() -> Job {
return ActualJob(id: "xyz")
}
}

现在,假设有一个驱动程序实体来驱动集成。

struct Someguy<C: Controllerable> {

private var controller: C

init(controller: C) {
self.controller = controller
}

func doSomething() {
let job = controller.getJob()
controller.control(job: job)
}
}

如果将所有这些都放在 playground 中,您会在控制台中看到以下内容:

playground:30:27: error: cannot convert return expression of type 'I.Job' to return type 'ActualJob'

return interactor.interact()

~~~~~~~~~~~^~~~~~~~~~

as! ActualJob

那么,问题是,如果 Interactable.JobControllerable.Job 符合相同的类型,为什么会出现上述错误?

编辑如果我将争用线更改为

return interactor.interact() as! ActualJob

错误消失了,但为什么需要这样做呢?这不会违背协议(protocol)的目的吗?

最佳答案

只需添加一个约束:

class Controller<I: Interactorable>: Controllerable where I.Job == ActualJob {

没有约束,I.Job 可以是任何东西,不是吗?它可能是 SomeOtherJob,它不能转换为 ActualJob

关于Swift:在面向协议(protocol)的方法中出错。错误:无法将类型 'I.Job' 的返回表达式转换为返回类型 'ActualJob',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51817105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com