【发布时间】:2021-07-18 11:08:56
【问题描述】:
我有一个带有关联类型的协议
protocol ProtocolA {
associatedType someType
}
现在我有两个通用函数
func funcA<someType>(_ data:someType) {
funcB(data) // cannot call
}
func funcB<someType:ProtocolA>(_ data:someType) {
}
我一直在尝试从 funcA 调用 funcB,但它不起作用我收到错误消息
Instance method 'funcB' requires that 'someType' conform to 'ProtocolA'
现在我知道 funcA 中的通用类型符合 ProtocolA 的事实。无论如何也要确保编译器也知道它吗?
我无法更改 funcA 方法声明以放置通用约束,因为这是另一个协议的要求。
我已经尝试在funcA中使用some关键字
var obj : some ProtocolA = data
但是我得到了错误
Property declares an opaque return type, but cannot infer the underlying type from its initializer expression
简而言之,无论如何我都可以在不更改 funcA 签名的情况下从 funcA 调用 funcB,但是可以将 funcB 签名更改为所需的任何内容
****编辑*****添加更多信息
funcA被protocl调用
protocol CommonService {
func funcA<ModelType>(_ data:ModelType)
}
class CommonServiceImpl : CommonService {
func funcA<someType>(_ data:someType) {
funcB(data) // cannot call
}
func funcB<someType:ProtocolA>(_ data:someType) {
//SomeCode here required that someType must implement ProtocolA
}
}
ProtocolA 包含在无法更改的第三方 pod 中。
*******编辑***********我是如何解决这个问题的
感谢@Mojtaba Hosseini 的回答,我对如何解决我的问题有了一个非常好的想法。
我只是在 CommonServiceProtocol 中编写了一个重载函数
protocol CommonService {
func funcA<ModelType>(_ data:ModelType)
func funcA<ModelType>(_ data:ModelType) where ModelType:ProtocolA
}
class CommonServiceImpl : CommonService {
func funcA<someType>(_ data:someType) {
funcB(data) // cannot call
}
func funcA<someType>(_ data:someType) where ModelType:ProtocolA {
funcB(data) // can be called
}
func funcB<someType:ProtocolA>(_ data:someType) {
//SomeCode here required that someType must implement ProtocolA
}
}
我的意思是这不是一个完美的解决方案,但考虑到在第三方 pod 中使用 ProtocolA 对相关类型的硬依赖,我会说它工作正常,这是尽可能避免第三方依赖的原因之一。
【问题讨论】:
-
您能分享一下您是如何调用 funcA 的吗?您传递的协议类型和协议定义是什么?
-
@NikhilJain 添加了更多信息
-
更不用说编译器了,你甚至无法说服 me
funcA中的someType必须符合ProtocolA。如果我有class A {},然后有CommonServiceImpl().funcA(A())怎么办?
标签: ios swift generics swift-protocols