在关联类型对象上使用KeyPath

时间:2019-06-23 18:59:07

标签: swift generics vapor associated-types swift-keypath

我正在使用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,但我仍然不明白,因为我没有尝试创建元组,所以我使用的是下标。

0 个答案:

没有答案