繁体   English   中英

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

[英]Cannot convert return expression of generic protocol's function type implementation

我想以下面描述的方式使用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具有泛型类型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
    }
}

Łukasz,我现在不知道它为什么不编译,但我找到了编译它的方法。 只需更改return语句:

return modelObtained as? ObtainedModelType

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM