【发布时间】:2018-03-23 14:05:31
【问题描述】:
我有一个有趣的问题:
class ListCache {
public func getCachedList<T: Codable>() -> [T]? {
//loads list from file cache using Codable
}
}
假设我有 Foo 类:
class Foo: Codable {
var bar = ""
}
现在,我可以这样做:
let array: [Foo] = ListCache().getCachedList()
但我不能这样做:
var listsToLoad: [AnyClass] = [Foo.self]
let clazz = listsToLoad[0]
let array: [Codable] = ListCache().getCachedList()
编译器给我一个错误:
无法显式特化泛型函数
这意味着我不能在循环中调用getCachedList(),因为我必须明确地给它一个类类型。
有没有办法做到这一点?我也尝试过使用泛型类,但我几乎都以同样的方式结束。
编辑:
我尝试过创建:
class CodableClass: Codable {
}
然后:
class Foo: CodableClass {
//...
}
现在编译器说 clazz 是未声明的:
var listsToLoad: [CodableClass.Type] = [Foo.self]
for clazz in listsToLoad {
if let array: [clazz] = ListCache().getCachedList() {
print(array.count)
}
}
我也试过clazz.Type 和clazz.self。
【问题讨论】:
-
为什么你需要在这里使用泛型?你不能只使用
public func getCachedList() -> [Codable]?。我真的不明白你在最后一段代码中在做什么。var listsToLoad: [AnyClass] = [Foo.self]对我来说没有意义,赋值看起来更像是类型定义? -
那是因为在 getCachedList 我从文件加载 json 并使用 Codable 我将它转换为 [T] 数组。
-
您正在尝试通过
let array: [Codable] = ListCache().getCachedList()创建 Codable 对象数组。但无法构造协议“Codable”,因为它没有可访问的初始化程序。 -
有没有办法使用与 Codable 不同的东西来使用这样的数组?
-
另一个建议是:停止自己实现缓存,让URLCache 完成所有工作。在您的请求中,您可以指定缓存策略,您的服务器可以在响应标头中添加
Cache-Control信息。