Я пытаюсь написать статический обобщенный метод, который принимает протокол в качестве аргумента и регистрирует экземпляр класса в контейнере Swinject в качестве разрешения протокола.Важно, чтобы я не мог зарегистрировать модуль в качестве протокола, которому он не соответствует.
Я написал что-то вроде этого:
/// 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()
}
}
}
Он не компилируется, потому что, очевидно, Self может не соответствоватьв P
Я также попытался указать общее ограничение, используя where
:
where Self: P
делает ошибку компиляции "Тип" Self ", ограниченный непротокольным, не классовым типом'P' ' where self: P
делает ошибку множественной компиляции. where Self: P.Type
делает ошибку компиляции "Тип" Self "ограничен не протоколом, не классом типа" P.Type "« where self: P.Type
делает несколько ошибок компиляции.
Мне также интересно, могу ли я указать ограничение, что P может быть только протоколом.