1

我正在使用 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.mdkeyPath标是在扩展名上定义的Any,我认为T应该也成为一个Any

Any某种程度上(<- 我不得不这样做),我确信我已经看到keyPaths 被用于泛型(我不完全理解泛型和关联类型的不同之处)。那么有没有人知道keyPath在这种情况下可能导致下标不可用的原因是什么?仅仅是因为它是一个关联类型,有什么办法可以让这个工作吗?

更新

t如果我通过将其转换为来擦除类型,Any我仍然会收到no subscripts错误,如果我将其转换为,AnyObject我不会收到下标错误,但我仍然会收到Cannot create a single-element tuple我不理解的,因为我没有尝试制作元组,我正在使用下标。

4

0 回答 0