Использование KeyPaths для объектов связанных типов - PullRequest
1 голос
/ 23 июня 2019

Я делаю бэкэнд, используя Vapor 3 и Swift 5. В какой-то части я пытаюсь использовать KeyPath для ассоциированного типа, например, так:

protocol MyProtocol {
  associatedType T: Model & Parameter
  // Some more declarations
}

extension MyProtocol where T.ID: Parameter {
  func myFunction(_ req: Request) throws -> Future<T> {
    return try req.content.decode(T.self).flatMap { t in
      //Do some stuff
      let myId = t[keyPath: T.ID] //Value of type Self.T has no subscripts
                                  //Cannot create a single-element tuple with an element label
      //Do some more stuff
    }
  }
}

Но я получаю эту Value of type Self.T has no subscripts ошибку. Я посмотрел и в соответствии с этим: https://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md индекс keyPath определен для расширения до Any, и я бы предположил, что T также должен быть Any.

В Any (<- я должен был ?), я уверен, что видел <code>keyPath, которые используются на дженериках (я не до конца понимаю, как дженерики и связанные типы различаются). Так у кого-нибудь есть идея, что может привести к недоступности индекса keyPath в этом случае? Только потому, что это ассоциированный тип, есть ли способ заставить эту работу работать?

Обновление

Если я стираю тип t, приведя его к Any, я все равно получаю ошибку no subscripts, если я приведу его к AnyObject, я не получаю ошибку подписчиков, но все равно получаю Cannot create a single-element tuple которого я не понимаю, поскольку я не пытаюсь создать кортеж, я использую индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...