Swift 是否支持协议中的协方差返回类型?

问题描述 投票:0回答:0

我发现here协议中可以使用函数重写。显然,它可以覆盖签名,而不是实现。因此,如果它不是阴影,则仅对协变/逆变有意义。我尝试测试它,但我的检查失败了。

class Egg { }

class EasterEgg : Egg { }

protocol EggTray {
  func get_1() -> Egg;
  func get_2() -> Egg;
  func get_3() -> Egg;
  func get_4() -> Egg;
}

protocol EasterEggTray : EggTray { 
  override func get_1() -> EasterEgg;
  override func get_2() -> EasterEgg;
  override func get_3() -> EasterEgg;
  override func get_4() -> EasterEgg;
}

错误消息表明支持“覆盖”,但编译器无法匹配两个函数(它忽略协方差)。

错误:方法不会覆盖其父协议中的任何方法
覆盖 func get_1() -> EasterEgg;

注意:此处可能被重写实例方法“get_1()”
func get_1() -> 鸡蛋;

协方差返回类型适用于类,但对于协议来说,它是不可编译的。 Swift 支持协议中的协方差返回类型吗?如果是 - Swift 期望它如何用代码编写? (我知道如何使用关联的类型来做到这一点,但这不是我正在寻找的。)如果不是 - 为什么不呢? Swift 不支持的原因是什么?协议中使用“override”关键字的原因是什么?

swift protocols covariance covariant-return-types
© www.soinside.com 2019 - 2024. All rights reserved.