转换为协议默认方法的泛型类型

Posted

技术标签:

【中文标题】转换为协议默认方法的泛型类型【英文标题】:Cast to generic type for protocol default method 【发布时间】:2020-12-06 22:55:10 【问题描述】:

我正在尝试为获取请求创建一个具有默认实现的协议。我遇到的问题是它应该返回的类型需要是通用的,而不是从协议中设置的东西,而是在调用它的东西上。我真正需要的是一个方法,你可以传入某种类型,然后在你返回它时使用它来转换值,但从我读过的内容来看,这在 Swift 中是不可能的,因为类型是在编译时确定的。

这是我目前拥有的代码:

func fetchData<T: Decodable>(type: T.Type) -> [Decodable]? 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName),
        result = try? context.fetch(fetchRequest)

    return result as? [type]

当前代码出现以下错误。

在范围内找不到类型“类型”

【问题讨论】:

【参考方案1】:

只需使用T 转换您的results 数组,如下所示:

func fetchData<T: Decodable>(type: T.Type) -> [T]? 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName),
        result = try? context.fetch(fetchRequest)

    return result as? [T]

或者更好地指定T 类型既是Decodable 又是NSFetchRequestResult。那么你就不需要类型转换了:

func fetchData<T: Decodable & NSFetchRequestResult>(type: T.Type) -> [T]? 
    let fetchRequest = NSFetchRequest<T>(entityName: entityName)
    return try? context.fetch(fetchRequest)

【讨论】:

我希望能够使响应符合我的自定义 Decodable 类型之一。在您提供的示例上调用 fetchData() 时,我收到了 Generic parameter 'T' could not be inferred @JoeScotto 你能在你的问题中包含调用这个函数的代码吗?

以上是关于转换为协议默认方法的泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

返回类型为协议的泛型函数与参数和返回类型为协议的非泛型函数的区别

Java中的泛型的问题?

java如何获得泛型中的类

java类的泛型方法调用问题

java 方法中如何在返回类型使用泛型

如何判断我的泛型类型是不是支持某个接口并为函数来回转换到该接口? [复制]