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

时间:2016-05-11 19:26:44

标签: swift oop protocols covariance

为什么不快速支持协议中定义的方法中的返回类型协变? e.g

class Base { }

class Derived : Base { }

protocol Requirement {
  var someVariable : Base { get }
}

struct MyStruct : Requirement{
 let someVariable : Derived
}

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

2 个答案:

答案 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