转换为协议默认方法的泛型类型
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 你能在你的问题中包含调用这个函数的代码吗?以上是关于转换为协议默认方法的泛型类型的主要内容,如果未能解决你的问题,请参考以下文章