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'
我有两个接口 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)
}
}
如果将所有这些都放在 playground 中,您将在控制台中看到以下内容:
playground:30:27: error: cannot convert return expression of type
'I.Job' to return type 'ActualJob'
return interactor.interact()
~~~~~~~~~~~^~~~~~~~~~
as! ActualJob
那么,问题来了,如果Interactable.Job
和Controllerable.Job
符合相同的类型,为什么会出现上面的错误呢?
编辑
如果我将争论线更改为
return interactor.interact() as! ActualJob
错误消失了,但为什么需要这样做?这不会破坏协议的目的吗?
只需添加一个约束:
class Controller<I: Interactorable>: Controllerable where I.Job == ActualJob {
没有约束,I.Job
可以是任何东西,不是吗?它可能是 SomeOtherJob
,它不能转换为 ActualJob
。
我有两个接口 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)
}
}
如果将所有这些都放在 playground 中,您将在控制台中看到以下内容:
playground:30:27: error: cannot convert return expression of type 'I.Job' to return type 'ActualJob'
return interactor.interact()
~~~~~~~~~~~^~~~~~~~~~
as! ActualJob
那么,问题来了,如果Interactable.Job
和Controllerable.Job
符合相同的类型,为什么会出现上面的错误呢?
编辑 如果我将争论线更改为
return interactor.interact() as! ActualJob
错误消失了,但为什么需要这样做?这不会破坏协议的目的吗?
只需添加一个约束:
class Controller<I: Interactorable>: Controllerable where I.Job == ActualJob {
没有约束,I.Job
可以是任何东西,不是吗?它可能是 SomeOtherJob
,它不能转换为 ActualJob
。