为什么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
。