由于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的一个功能,并且永远不会像我想的那样工作?
答案 0 :(得分:0)
如果您想传递Factory<T>
T
类型为AnyObject
的任何init(childFactory: Factory<T>) {
factoryClosure = { () -> T in
return otherFactory.create()
}
}
,您只需写一下:
$_ =~ s/\r?\n//;
因为T会被你的班级自动约束。