在Swift泛型类型中包含继承约束

时间:2018-10-03 11:58:46

标签: swift generics

我正在尝试使用Swift和泛型创建一个基本的Service Locator / DI实现。我要完成的工作是注册 type implementation-type 并在签名中约束这两个,以便派生 implementation-type 来自 type

但是我似乎无法提出正确的语法(如果可能的话)。我的天真尝试:

func register<T, U>(type: T.Type, implementationType: U.Type) where U: T {
    // ...
}

但是,它不会与以下消息一起编译:

Type 'U' constrained to non-protocol, non-class type 'T'

添加约束where T: AnyObject并没有帮助。

是否可以限制签名中的继承?

1 个答案:

答案 0 :(得分:0)

解决方案。

我想像一下您有一些类,而其中的几个类都是其他类的根,这些类是您的“ resister”功能的客户。

设置名为Root的无效协议

protocol Root {}

使根类符合协议根

extension YourRootClasses: Root {}

eg: 
class A: Root {} ; class B: A {}
class Mainstuff: Root {} ; class SubStuff: MainStuff

然后,您可以检查通用U到Root协议的一致性或继承性。

func register<T, U>(type: T.Type, implementationType: U.Type) where U: Root {
// ...
}

的确,如果您有A-> B-> C并要严格检查C-> B,则无法使用。