Я делаю бэкэнд, используя 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
которого я не понимаю, поскольку я не пытаюсь создать кортеж, я использую индекс.