[英]Generic parameter constrained by other generic parameter
由于Swift缺乏协方差,我需要一些解决方法。 我来自Java世界,因此我本能地尝试创建从一种类型到另一种通用类型的约束。
所以我写了下面的课:
class Factory<T: AnyObject> {
let factoryClosure: () -> T
init(closure: () -> T) {
factoryClosure = closure
}
init<CHILD: T>(childFactory: Factory<CHILD>) {
factoryClosure = { () -> T in
return otherFactory.create()
}
}
func create() -> T {
return factoryClosure()
}
}
我希望这能正常工作。 我定义了T
, CHILD
应该是T
的子类。 但是,Swift编译器不同意并在init<CHILD: T>
的行上显示以下错误。
从非协议,非类类型“ T”继承
我也在不同的场景中尝试了通用参数继承。 在类中添加以下方法(并删除导致编译错误的init)。
func to<OTHER where OTHER: AnyObject, T: OTHER>() {
}
这产生基本上相同的输出。
类型“ T”限制为非协议类型“ OTHER”
我虽然可能无法进行任何操作,但以类似的错误消息结束。 这是Swift中的错误吗? 还是我错过了什么? 还是它是Swift的功能,并且将永远无法按照我的想法工作?
如果要传递任何T
为AnyObject
类型的Factory<T>
,则只需编写:
init(childFactory: Factory<T>) {
factoryClosure = { () -> T in
return otherFactory.create()
}
}
因为T会自动受到您的班级的约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.