Swift ︰ 我怎样才能具有子类返回类型的函数符合一项议定书,其中一个超类定义为返回类型?

标签: Swift
发布时间: 2017/3/6 23:01:56
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一项议定书,其中定义了一个函数,函数的返回类型是 SuperclassType

在一类符合议定书 》,我试图定义此函数,但与 SubclassType 返回类型。

编译器告诉我,这类不符合议定书 》 而作的因为显然 SubclassType ! =SuperclassType

protocol SomeProtocol {
  func someFunction(someParameter:SomeType) -> SuperclassType?
}

class SomeClass : SomeProtocol {
  func someFunction(someParameter:SomeType) -> SubclassType? {
    ...
  }
}

class SubclassType : SuperclassType { }

常识告诉我,虽然, SubclassType 应该是适当的代替 SuperclassType 在这件事。

我到底做错了?

谢谢你。

解决方法 1:

你走得更远之前,我会推荐一些背景阅读关于协方差 vs 逆变Liskov 替换原则

  • 返回类型方法时创建子类重写协变︰ 子类重写的方法可以返回的超类方法的返回类型的子类型

  • 泛型类型参数不︰ 专业化可以既不缩小也不扩大类型的要求。

Protocol与采用它的具体类型之间的关系也更像是仿制药比喜欢子类化,所以在Protocol中声明的返回类型是不变的。(很难确切地说为什么第一次读取。可能事情存在 vs 只约束Protocol?)

您可以允许协方差在Protocol通过指定关联类型的要求,但︰

protocol SomeProtocol {
    typealias ReturnType: SuperclassType
    func someFunction(someParameter: SomeType) -> ReturnType
}

class SomeClass : SomeProtocol {
    func someFunction(someParameter: SomeType) -> SubclassType { /*...*/ }
}

现在,很明显的返回类型的 someFunction 型采用 SomeProtocol 必须为 SuperclassType 或及其子类型。

赞助商