Почему экзистенциальный метатип протокола теряет информацию о наследовании? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть универсальная функция, в которой я передаю тип 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))

Не работает и выдает следующую ошибку:

xcode error

Если я уберу ограничение 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")
   }
}

Есть ли другой способ установить это ограничение?Я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 21 сентября 2018

Фактически, вы не получаете тип протокола в параметре type вашего метода getStruct.Вы получаете struct, enum или class, которые соответствуют BaseProtocol

. Вы можете посмотреть это для получения дополнительной информации: Ответ: Почему я не могу передать Protocol.Type toуниверсальный параметр T.Type?

...