我想以下述方式使用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
    }
}

10-04 12:03