У меня есть универсальная функция, в которой я передаю тип protocol
и на основе переданного типа я возвращаю требуемый struct
.Если я накладываю ограничение протокола на универсальный шаблон, даже если переданный протокол соответствует ему, я получаю сообщение об ошибке.
protocol BaseProtocol {}
protocol ProtocolA: BaseProtocol {}
protocol ProtocolB: BaseProtocol {}
struct StructA: ProtocolA {}
struct StructB: ProtocolB {}
Когда я определяю свою функцию с таким ограничением:
func getStruct<T: BaseProtocol>(type: T.Type) -> T {
switch type {
case is ProtocolA.Protocol:
return StructA() as! T
case is ProtocolB.Protocol:
return StructB() as! T
default:
fatalError("Unknown Type")
}
}
let result = getStruct(type: ProtocolA.self)
print(type(of: result))
Не работает и выдает следующую ошибку:
Если я уберу ограничение BaseProtocol, все будет работать нормально:
func getStruct<T: Any>(type: T.Type) -> T {
switch type {
case is ProtocolA.Protocol:
return StructA() as! T
case is ProtocolB.Protocol:
return StructB() as! T
default:
fatalError("Unknown Type")
}
}
Есть ли другой способ установить это ограничение?Я что-то здесь не так делаю?