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

标签 ios swift generics swift4

我有一个有趣的问题:

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/

相关文章:

java - 为什么 Java 8 泛型类型推断选择这个重载?

Java 通用类型不匹配错误

ios - 将 presentModalViewController 与 Storyboard一起使用

iOS/Swift : PFFacebookUtils. logInWithPermissions 返回零用户和错误

ios - 如何在iOS中管理单个项目副本中的多个项目?

java - 如何使用Java泛型返回不同的POJO

ios - Swift - 如何从枚举变量获取枚举大小写参数?

javascript - 仅在 Safari 中发生的 XHR 请求的 DOM 异常 11

swift - 在 swift 。当我创建两个同名的声音文件时,第二个是否会替换第一个?

Swift 2 错误处理和 while