为什么不快速支持协议中定义的方法中的返回类型协变? e.g
class Base { }
class Derived : Base { }
protocol Requirement {
var someVariable : Base { get }
}
struct MyStruct : Requirement{
let someVariable : Derived
}
编译器会发出MyStruct不符合协议要求的错误。据我所知,MyStruct满足了LSP的所有要求,所以我想知道为什么Swift中不允许这样做?
答案 0 :(得分:1)
上下文在这里非常重要,所以我不知道这是否能满足您的需求。
我的回答是使用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
}
答案 1 :(得分:0)
想象一下你有:
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
。