我想以下面描述的方式使用swift泛型:
class ResponseContainer {
}
protocol DisplayManageable {
func getModel<ModelType: ResponseContainer>() -> ModelType?
}
class DisplayBaseManager<ObtainedModelType: ResponseContainer>: NSObject, DisplayManageable {
var modelObtained: ObtainedModelType? = nil
func getModel<ObtainedModelType>() -> ObtainedModelType? {
return modelObtained
}
}
但我对此代码有疑问,更准确地说,这一行存在问题:
return modelObtained
我收到了错误:
无法转换类型&#39; ObtainedModelType的返回表达式?&#39;至 返回类型&#39; ObtainedModelType?&#39;
现在我的简单问题是,我为什么不这样做?那有什么不对?
协议函数和类定义中的泛型是相同的。在我看来,一切看起来都很好,从逻辑上来说还可以,所以为什么我不这样做呢?
答案 0 :(得分:2)
在
func getModel<ObtainedModelType>() -> ObtainedModelType? { ... }
ObtainedModelType
引入了本地通用占位符
隐藏类定义中的ObtainedModelType
class DisplayBaseManager<ObtainedModelType: ResponseContainer>
这会导致看起来很奇怪的错误消息
无法转换'ObtainedModelType?'类型的返回表达式返回类型'ObtainedModelType?'
因为return modelObtained
具有通用类型ObtainedModelType?
类定义,但预期的返回类型是ObtainedModelType?
来自方法定义。
您可能需要的是具有关联类型
的协议protocol DisplayManageable {
associatedtype ModelType: ResponseContainer
func getModel() -> ModelType?
}
以及使用此协议的ModelType == ObtainedModelType
类:
class DisplayBaseManager<ObtainedModelType: ResponseContainer>: NSObject, DisplayManageable {
var modelObtained: ObtainedModelType? = nil
func getModel() -> ObtainedModelType? {
return modelObtained
}
}
答案 1 :(得分:1)
Łukasz,我现在不知道它为什么不编译但是我找到了编译它的方法。只需更改return语句:
return modelObtained as? ObtainedModelType
但我仍在等待有人解释原始代码中的错误原因。