我正在使用 Vapor 3 和 Swift 5 制作后端。在某些方面,我试图KeyPath
在关联类型上使用 a ,如下所示:
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
s 被用于泛型(我不完全理解泛型和关联类型的不同之处)。那么有没有人知道keyPath
在这种情况下可能导致下标不可用的原因是什么?仅仅是因为它是一个关联类型,有什么办法可以让这个工作吗?
更新
t
如果我通过将其转换为来擦除类型,Any
我仍然会收到no subscripts
错误,如果我将其转换为,AnyObject
我不会收到下标错误,但我仍然会收到Cannot create a single-element tuple
我不理解的,因为我没有尝试制作元组,我正在使用下标。