由于斯威夫特缺乏协方差,我需要一些解决方法.我来自
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>行上显示以下错误.
Inheritance from non-protocol,non-class type ‘T’
我也尝试了不同场景中的泛型参数继承.将以下方法添加到类中(并删除导致编译错误的init).
func to<OTHER where OTHER: AnyObject,T: OTHER>() { }
这产生基本相同的输出.
Type ‘T’ constrained to non-protocol type ‘OTHER’
我可能工作的任何东西都没有,并以类似的错误消息结束.这是Swift中的错误吗?或者我错过了什么?或者它是Swift的一个功能,并且永远不会像我想的那样工作?
解决方法
如果你想通过任何工厂< T>其中T是AnyObject类型,你只需要写:
init(childFactory: Factory<T>) { factoryClosure = { () -> T in return otherFactory.create() } }
因为T会被你的班级自动约束.