Swift: Error during protocol oriented approach. Error: cannot convert return expression of type 'I.Job' to return type 'ActualJob'

Swift: Error during protocol oriented approach. Error: cannot convert return expression of type 'I.Job' to return type 'ActualJob'

我有两个接口 ControllerableInteractorable,它们应该协同工作以实现某些目标。以下是协议:

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

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

以下是符合上述协议的具体类型: 这里要注意一件事,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

错误消失了,但为什么需要这样做?这不会破坏协议的目的吗?

只需添加一个约束:

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

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