2

我有两个接口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)
    }
}

如果你把所有这些都放在操场上,你会在控制台中看到以下内容:

游乐场:30:27:错误:无法将“I.Job”类型的返回表达式转换为“ActualJob”类型

返回交互器.interact()

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

作为!实际工作

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

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

return interactor.interact() as! ActualJob

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

4

1 回答 1

2

只需添加一个约束:

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

没有约束,I.Job什么都可以,不是吗?可能是SomeOtherJob,它不能转换为ActualJob

于 2018-08-13T07:29:43.240 回答