我有一个有趣的问题:

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.Typeclazz.self

最佳答案

我相当肯定,为了调用泛型函数,必须在编译时知道该函数的参数类型。由于 [Foo] 实际上只是 Array<Foo> 的简写,这也适用于类型化数组(尝试编写 Array<clazz> ;它不会编译)。因此,当您在 clazz 变量中有一个类型时,实际类只能在运行时知道,您不能使用它来调用泛型函数,也不能声明该类的类型数组。

AFAIK,唯一的解决方案是:

  • 使用 [Codable] 或:
  • 找到一种方法来动态地、Objective-C 风格地做你想做的事情
  • 找到另一种方式来做你想做的事情:-(

  • 不幸的是,由于我不知道您最终想要做什么,因此很难超越它。

    关于ios - 在 Swift 4 中将 AnyObject 作为通用 T 参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49451473/

    10-10 20:56