我有一个有趣的问题:
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()
编译器给我一个错误:
Cannot explicitly specialize a generic function
这意味着我不能在循环中调用 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
中输入类型时变量,这样实际的类只在运行时才知道,你不能用它来调用泛型函数,也不能声明一个类型为该类的数组。
据我所知,唯一的解决方案是:
使用
[Codable]
找到一种动态地、Objective-C 风格的方法来完成您想做的事情,或者:寻找另一种方法来完成您想要做的事情:-(
由于我不知道您最终想要做什么,所以很遗憾,很难超出这个范围。
关于ios - 在 Swift 4 中将 AnyObject 作为通用 T 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49451473/