由其他通用参数约束的通用参数

时间:2015-05-23 21:50:06

标签: ios swift generics

由于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()
    }
}

我希望这个工作得很好。我定义了TCHILD应该是T的子类。然而,Swift编译器不同意并在使用init<CHILD: T>的行上显示以下错误。

  

从非协议非类型'T'

继承

我也尝试了不同场景中的泛型参数继承。将以下方法添加到类中(并删除导致编译错误的init)。

func to<OTHER where OTHER: AnyObject, T: OTHER>() {

}

这产生的输出基本相同。

  

键入'T'约束为非协议类型'OTHER'

我可能工作的任何东西都没有,并以类似的错误消息结束。这是Swift中的错误吗?或者我错过了什么?或者它是Swift的一个功能,并且永远不会像我想的那样工作?

1 个答案:

答案 0 :(得分:0)

如果您想传递Factory<T> T类型为AnyObject的任何init(childFactory: Factory<T>) { factoryClosure = { () -> T in return otherFactory.create() } } ,您只需写一下:

$_ =~ s/\r?\n//;

因为T会被你的班级自动约束。

相关问题