我正在尝试使用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
并没有帮助。
是否可以限制签名中的继承?
答案 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,则无法使用。