Swift 存储泛型类型的项

Swift 存储泛型类型的项,swift,generics,Swift,Generics,因此,我正在编写一个应用程序,它使用库解析我们的JSON。效果很好。然而,我正试图找到一种方法来缓存我们得到的解析类型。它们都实现为结构。我试过这样的方法: struct CachedItem <T: Decodable where T == T.DecodedType> { let value: T let cachedTime: NSTimeInterval init(value: T) { self.value = value

因此,我正在编写一个应用程序,它使用库解析我们的JSON。效果很好。然而,我正试图找到一种方法来缓存我们得到的解析类型。它们都实现为结构。我试过这样的方法:

struct CachedItem <T: Decodable where T == T.DecodedType> {
    let value: T
    let cachedTime: NSTimeInterval

    init(value: T) {
        self.value = value
        cachedTime = NSDate().timeIntervalSince1970
    }

    func isExpired() -> Bool {
        let currentTime = NSDate().timeIntervalSince1970
        return ((currentTime - cachedTime) > 20.minutes)
    }
}
var cache: [NSURL : CachedItem]
var cache: [NSURL : CachedItem<Item>]
失败,错误为:“引用泛型类型'CachedItem'需要中的参数”,我理解这意味着我需要执行以下操作:

struct CachedItem <T: Decodable where T == T.DecodedType> {
    let value: T
    let cachedTime: NSTimeInterval

    init(value: T) {
        self.value = value
        cachedTime = NSDate().timeIntervalSince1970
    }

    func isExpired() -> Bool {
        let currentTime = NSDate().timeIntervalSince1970
        return ((currentTime - cachedTime) > 20.minutes)
    }
}
var cache: [NSURL : CachedItem]
var cache: [NSURL : CachedItem<Item>]

基本上,关于这个缓存中的类型,你所能说的只是它们是可解码的,这并不能告诉你任何有用的东西,因为它们已经被解码了。这就剩下了
任何对象
。如果这真的是“任何东西的缓存”,那么
[NSURL:AnyObject]
甚至
[NSURL:Any]
都是合适的。这使得消费端在确定其类型方面存在很多问题,但这基本上与解析JSON(基本上与
AnyObject
)时必须使用的问题相同


我很少建议使用
AnyObject
,但在这种情况下,如果您真的需要一个大缓存(而不是每个类型都需要一个缓存,如果可能的话,这会更好)。

幸运的是,解析JSON的丑陋之处被Alamofire和Argo所掩盖,因此当涉及到实际的
解码()时,类型是相当干净的
Argo需要。现在我想起来了,无论这些项是否为泛型,转换逻辑似乎都是一样的。我将查看每种类型的缓存,但这似乎有点奇怪,因为缓存中一次只有每种类型的一个项。我的意思是,我想我可以为那个案例预设缓存,但这看起来更奇怪。