协议方法中的返回类型协方差



为什么swift不支持协议中定义的方法中的返回类型covarience?例如

class Base { }
class Derived : Base { }
protocol Requirement {
  var someVariable : Base { get }
}
struct MyStruct : Requirement{
 let someVariable : Derived
}

编译器处理了一个错误,即MyStruct不符合协议要求。据我所知,MyStruct满足LSP的所有要求,所以我想知道为什么Swift不允许这样做?

上下文在这里很重要,所以我不知道这是否会得到你想要的。

我的答案是使用associatedtype

从相同的设置开始

class Base { }
class Derived: Base { }

这一次,我将在协议中定义一个类型,它必须是某种类型的Base

protocol Requirement {
    associatedtype KindOfBase: Base
    var someVariable: KindOfBase { get }
}

现在你得到了你想要的。

struct MyStruct: Requirement {
    let someVariable: Derived
}
struct MyStruct2: Requirement {
    let someVariable: Base
}

想象一下你有:

var requirement: Requirement?

并且您想要分配类型为Base 的变量

let myBaseInstance = Base()
requirement.someVariable = myBaseInstance

如果您查看您的结构,这是不可能的,因为base的实例不是从Derived继承的。

换句话说,这是不可能的(但根据协议的定义,这必须是可能的):

var requirement: Requirement? = MyStruct()
requirement.someVariable = myBaseInstance //error 

第2行出现错误,因为someVariable的类型必须为Derived,但myBaseInstance的类型仅为Base,可能不符合Derived

相关内容

  • 没有找到相关文章

最新更新