我有一个有趣的问题:
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
。 最佳答案
我相当肯定,为了调用泛型函数,必须在编译时知道该函数的参数类型。由于 [Foo]
实际上只是 Array<Foo>
的简写,这也适用于类型化数组(尝试编写 Array<clazz>
;它不会编译)。因此,当您在 clazz
变量中有一个类型时,实际类只能在运行时知道,您不能使用它来调用泛型函数,也不能声明该类的类型数组。
AFAIK,唯一的解决方案是:
[Codable]
或: 不幸的是,由于我不知道您最终想要做什么,因此很难超越它。
关于ios - 在 Swift 4 中将 AnyObject 作为通用 T 参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49451473/