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

由于斯威夫特缺乏协方差,我需要一些解决方法.我来自 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会被你的班级自动约束.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...