我正在使用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
的方式(<-我必须做?),我确定已经看到keyPath
用于泛型(我不完全了解泛型和关联类型的不同之处)。那么,有谁知道在这种情况下可能导致keyPath
下标不可用的原因吗?仅仅是因为它是一个关联类型,有什么办法可以使我完成这项工作?
更新
如果我通过将t
的类型强制转换为Any
来擦除类型,我仍然会遇到no subscripts
错误,如果我将其强制转换为AnyObject
则不会下标错误,但是我仍然得到Cannot create a single-element tuple
,但我仍然不明白,因为我没有尝试创建元组,所以我使用的是下标。