我想以下述方式使用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
而且我得到了错误:
无法转换类型为'ObtainedModelType?'的返回表达式至
返回类型'ObtainedModelType?'
现在我的简单问题是,为什么我不能这样做?怎么了
协议功能和类定义中的泛型相同。我认为一切看起来都很好,并且在逻辑上还可以,那么为什么我不能这样做呢?
最佳答案
在
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
}
}