首页 > 解决方案 > 作为参数的通用协议因“无法使用类型的参数列表调用”错误而失败

问题描述

我在操场上有这段代码,但它没有编译。错误是Cannot invoke 'actionDispatcher' with an argument list of type '(uiEvent: MyEvent)'

这是代码片段:

import UIKit

protocol CircuitUiEvent {}

protocol CircuitInteractor {

    associatedtype UiEvent: CircuitUiEvent

    func actionDispatcher(uiEvent: UiEvent)
}

enum MyEvent: CircuitUiEvent {
    case hello

}

class MyInteractor: CircuitInteractor {

    typealias UiEvent = MyEvent

    func actionDispatcher(uiEvent: MyEvent) {
        print("Hello")
    }
}

extension CircuitInteractor {

    func myTestFunction() {
        let uiEvent = MyEvent.hello
        actionDispatcher(uiEvent: uiEvent) <--- this line throws the error
    }
}

let interactor = MyInteractor()
interactor.myTestFunction()

有任何想法吗?我需要的是一个符合要作为参数传递的协议的枚举,所以我可以有一个简单的 API 定义,根据它的使用位置或它背后的模型,它可以使用不同的 switch 语句。

标签: swiftgenericsprotocols

解决方案


除非我误解了某些东西,否则您似乎需要转到myTestFunction课堂MyInteractor,因为它是一个使用具体事件类型同时CircuitInteractor使用通用协议的函数。也许,这样的事情会有意义?

protocol CircuitUiEvent {}

protocol CircuitInteractor {
  associatedtype UiEvent: CircuitUiEvent
  func actionDispatcher(uiEvent: UiEvent)
}

extension CircuitInteractor {
  func actionDispatcher(uiEvent: UiEvent) {
    print(uiEvent)
  }
}

enum MyEvent: CircuitUiEvent {
  case hello
}

class MyInteractor: CircuitInteractor {
  typealias UiEvent = MyEvent
  func myTestFunction() {
    self.actionDispatcher(uiEvent: .hello)
  }
}

let interactor = MyInteractor()
interactor.myTestFunction()

推荐阅读