gpt4 book ai didi

ios - 在 Swift 4 中将 AnyObject 作为通用 T 参数传递

转载 作者:搜寻专家 更新时间:2023-10-31 08:28:54 25 4
gpt4 key购买 nike

我有一个有趣的问题:

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

最佳答案

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

据我所知,唯一的解决方案是:

  1. 使用 [Codable] 找到一种动态地、Objective-C 风格的方法来完成您想做的事情,或者:

  2. 寻找另一种方法来完成您想要做的事情:-(

由于我不知道您最终想要做什么,所以很遗憾,很难超出这个范围。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com