无法转换泛型协议的函数类型实现的返回表达式

时间:2016-03-31 08:45:55

标签: ios swift generics

我想以下面描述的方式使用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;

现在我的简单问题是,我为什么不这样做?那有什么不对?

协议函数和类定义中的泛型是相同的。在我看来,一切看起来都很好,从逻辑上来说还可以,所以为什么我不这样做呢?

2 个答案:

答案 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

但我仍在等待有人解释原始代码中的错误原因。