具有通用的迅速函数,其中约束是一种自我符合的协议



我正在尝试编写一个静态通用方法,该方法将协议作为参数和注册类实例作为协议解决方案。重要的是我不能注册一个模块作为协议,它不符合。

我写了这样的东西:

/// 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指定通用约束:

  1. where Self: P确实编译错误" type'self'被限制为非协议,非类型'p'"
  2. where self: P做多个编译错误。
  3. where Self: P.Type确实编译错误"键入'自我'被限制为非协议,非类型的'p.type'
  4. 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()
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新