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

Tad*_*riz 8 generics ios 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

从非协议,非类型'T'继承

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

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

}
Run Code Online (Sandbox Code Playgroud)

这产生基本相同的输出.

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

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

Qby*_*yte 0

如果你想传递任何类型的Factory<T>where你只需要写:TAnyObject

init(childFactory: Factory<T>) {
    factoryClosure = { () -> T in
        return otherFactory.create()
    }
}
Run Code Online (Sandbox Code Playgroud)

因为 T 自动受到你的班级的约束。