Swift泛型struct适配Realm Object与Codable协议报错如何解决?
错误原因
Swift 中带类继承约束的泛型参数,必须接收具体的类类型作为实参。你代码中写的Object & Codable是描述类型特征的存在类型,本身并不属于Object的子类,因此不满足LocalResource的泛型约束,才会出现看似矛盾的报错提示。
解决方案
方案1:协议类型擦除(兼容所有Swift版本)
通过定义公共协议抹掉泛型参数的差异,让不同特化的LocalResource可以存入同一个数组:
- 定义通用协议
protocol LocalResourceType { var realmType: Object.Type { get } var resource: FileResource { get } // 可根据业务需求补充通用方法,示例为解码方法 func decode(from data: Data) throws -> [Object] }
- 让原泛型结构体遵守该协议
struct LocalResource<T: Object & Codable>: LocalResourceType { init (resource: FileResource) { self.realmType = T.self self.resource = resource } var codable: [T].Type { [T].self } var realmType: T.Type var resource: FileResource // 实现协议通用方法 func decode(from data: Data) throws -> [Object] { try JSONDecoder().decode([T].self, from: data) } }
- 声明数组时使用协议类型
let localModels: [LocalResourceType] = []
方案2:使用any存在类型(Swift 5.7+ 支持)
如果不需要额外封装通用逻辑,可直接用any关键字声明泛型的存在类型,无需额外定义协议:
let localModels: [any LocalResource] = []
内容的提问来源于stack exchange,提问作者Tim Ford
相关产品推荐
相关产品推荐

