我正在尝试编写一个静态通用方法,该方法将协议作为参数和注册类实例作为协议解决方案。重要的是我不能注册一个模块作为协议,它不符合。
我写了这样的东西:
/// RegisterableModule guarantee that conformer has `create()` method returning self
public extension RegisterableModule {
static func registerModule<P>(asProtocol proto: P.Type,
in container: Container) {
container.register(proto, name: nil) { (resolver) -> P in
return self.create()
}
}
}
它不会编译,因为显然自我可能不符合p
我还尝试使用where
指定通用约束:
-
where Self: P
确实编译错误" type'self'被限制为非协议,非类型'p'"
) -
where self: P
做多个编译错误。 -
where Self: P.Type
确实编译错误"键入'自我'被限制为非协议,非类型的'p.type' -
where self: P.Type
做多个编译错误。
我也想知道我是否可以指定一个约束,即P可以是协议。
不幸的是,(尚未)迅速定义对通用参数的要求,或者要求参数为协议。
这就是为什么Swinjects的类型 - 转向API不安全的原因。有一个"技巧"使人们能够表达一致性要求,但是我不确定这对您的用例是否实用:
extension RegisterableModule {
static func registerModule<P>(
asProtocol proto: P.Type,
in container: Container,
typeCheck: (Self) -> P
) {
container.register(proto) { _ in self.create() as! P }
}
}
MyModule.registerModule(
asProtocol: MyProtocol.self,
in: container,
typeCheck: { $0 }
)
您可以尝试一下吗,我只是添加了 p:someProtocol
public extension RegisterableModule {
static func registerModule<P:SomeProtocol>(asProtocol proto: P.Type,
in container: Container) {
container.register(proto, name: nil) { (resolver) -> P in
return self.create()
}
}
}