【问题标题】:Swift Generics: Cannot convert class and subtype existential value to expected argument typeSwift 泛型:无法将类和子类型存在值转换为预期的参数类型
【发布时间】:2018-12-05 16:33:04
【问题描述】:

给定

typealias CP = C & P
protocol P {}
class C {}
class D: C, P {}

func f<T: C>(ofType: T.Type) {}

并且给定CP 与预期的C 兼容:

let cp: CP = D()
let c: C = cp

为什么会出现以下错误?

f(ofType: CP.self)

错误:无法将类型“CP.Protocol”(又名“(C & P).Protocol”)的值转换为预期的参数类型“C.Type”


在 Swift 版本 4 中添加了声明类和协议的存在的能力,请参阅 SE-0156

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    这是“协议不符合自己”的另一个实例。虽然CP 描述的类型承诺既是C 的子类又是P 的实现者,但它本身不是这些东西。

    考虑C 具有必需的初始化,而f() 调用它的情况:

    class C {
        required init() {}
    }
    
    
    func f<T: C>(ofType: T.Type) {
        T()
    }
    
    f(ofType: CP.self)
    

    这相当于直接调用CP()。但是在这种情况下应该调用什么initCP 要求类型是Csome 子类,但是是哪一个?它甚至不能是C,因为C 不符合P。那么 Swift 应该构建什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多