У меня есть следующий протокол:
protocol PieceViewGateway {
subscript(_ identifier: PieceIdentifier) -> UIView {get}
}
Я использую это во многих местах таким образом:
struct SomeKindOfThing {
let viewGateway: PieceViewGateway
}
Это все хорошо и очень приятно.
Вот один пример конкретной реализации протокола (есть и другие реализации):
struct ViewDictionaryPieceViewGateway: PieceViewGateway {
let viewDictionary: [PieceIdentifier: UIView]
subscript(identifier: PieceIdentifier) -> UIView {
guard let item = viewDictionary[identifier] else {
fatalError("Gateway has no value for key: \(identifier)")
}
return item
}
}
У меня есть несколько таких протоколов.Другой - PieceValueGateway
, который возвращает Int
вместо UIView
.
Мне бы не хотелось реализовывать что-то вроде ViewDictionaryPieceViewGateway
для различных «аспектов», для которых мне нужны шлюзы.
Я пытался добиться этого, определяя протокол с помощьюсвязанный тип для шлюзов модели:
protocol PieceAspectGateway {
associatedtype Aspect
subscript(_ identifier: PieceIdentifier) -> Aspect {get}
}
Я бы тогда согласился PieceViewGateway
с этим:
protocol PieceViewGateway: PieceAspectGateway {
subscript(_ identifier: PieceIdentifier) -> UIView {get}
}
Однако, это дает много ошибок компиляции, которые:
Протокол 'PieceViewGateway' может использоваться только в качестве общего ограничения, поскольку он имеет собственные требования или требования к связанным типам
Об ошибках сообщается в коде , который был в порядке доЯ добавил соответствие PieceViewGateway: PieceAspectGateway
.Например, SomeKindOfThing
, объявляющий это, имеет let viewGateway: PieceViewGateway
.
Я также пытался соответствовать следующим образом:
protocol PieceViewGateway: PieceAspectGateway where Aspect == UIView {
subscript(_ identifier: PuzzlePieceIdentifier) -> UIView {get}
}
И так:
protocol PieceViewGateway: PieceAspectGateway {
typealias Aspect = UIView
subscript(_ identifier: PuzzlePieceIdentifier) -> UIView {get}
}
… но все эти варианты дают одинаковую ошибку при использовании PieceViewGateway
в качестве протокола.
Есть ли способ достичь этого?
Спасибо.