我有两个接口Controllerable
,Interactorable
它们应该协同工作以实现某些目标。以下是协议:
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.Job
和Controllerable.Job
符合相同的类型,为什么会出现上述错误?
编辑 如果我将争用线更改为
return interactor.interact() as! ActualJob
错误消失了,但为什么需要这样做呢?它不会违背协议的目的吗?