Swift无法转换匹配泛型约束的类型的值

时间:2018-04-17 15:01:35

标签: swift generics types swift4

鉴于以下类型

protocol AProtocol {}
protocol AnotherProtocol {}
class AClass: AProtocol, AnotherProtocol {}

我有点困惑为什么以下引发:"错误:无法转换类型的值' AClass'指定类型' T'"

class generic<T> where T:AProtocol, T:AnotherProtocol {
    let prop: T = AClass()
}

但以下工作正常:

class generic<T> where T: AProtocol, T: AnotherProtocol {
    let prop: T
    init(withProp prop: T) { self.prop = prop }
}

let instance = generic<AClass>(withProp: AClass())

1 个答案:

答案 0 :(得分:4)

您班级的通用参数由您班级的用户指定,而不是

你不能像你在第一个没有编译的代码片段中那样T AClass,因为T是由用户指定的。您班级的用户可能需要以下内容:

let myObject = generic<BClass>()

其中BClass 满足约束条件。那么当用户试图访问该属性时会发生什么?他将获得AClass的实例,但T实际上是BClass,所以他应该得到BClass。看到这里的矛盾?

关于你的评论:

  

换句话说,不可能从泛型类的实现中引用泛型类型的实现?

确切地说,因为你不知道那些类型会是什么。您可以调用在AProtocolAnotherProtocol中声明的方法。通用约束确保存在这些方法。

如果你想让它以你想要的方式运作,你需要所谓的协议组合

var someProperty: (AProtocol & AnotherProtocol) = AClass()