我试图定义一个通用类型函数,但是当我尝试调用此函数时,我得到Generic parameter 'T' could not be inferred
这是我的代码
func getBalance<T: BalanceListConstructable>(type: MarketType, completion:
@escaping ((T) -> Void), failure: ((Error) -> Void)?) where T : BalanceListConstructable { }
然后我使用
调用此函数getBalance(type: type, completion: { (result) in }) { (error) in}
但是这会给出上面的编译器错误。值得一提的是BalanceListConstructable
。我需要这个是协议,因为不同的类型需要调用这个函数,因此我不能明确指定类型。
类型:ListA和ListB都符合协议BalanceListConstructable
,该协议为两个类定义了自定义初始值设定项。
我想发出网络请求并根据调用者初始化完成处理程序的结果,这样如果调用ListA
类型,则调用ListA
的初始化程序等等
这是我的实施:
我首先定义BalanceListConstructable
和ListA
应符合的协议ListB
。
protocol BalanceListConstructable {
init(json:JSON,header:[AnyHashable : Any]?) throws}
然后我像这样实现我的功能
func getBalance<T>(type:MarketType,completion: @escaping ((T) ->
Void),failure: ((Error) -> Void)?) where T:BalanceListConstructable
通过执行此操作,我跳跃到能够基于调用者访问初始化程序,因此我需要初始化像这样的ListA
对象
try T(json:JSON,header:[AnyHashable : Any]?)
在这种情况下,可以是ListA
或ListB
但是在我的所有方法中,我无法让编译器理解ListA
或ListB
来电者。这有可能吗?