Swift如何获取所有遵守指定protocol的struct及相关实现方案
回答
核心结论
- 可以获取所有遵守指定
protocol的struct - 主流可行方案分为编译期代码生成和运行时私有接口调用两类
方案详情
方案1:编译期代码生成(生产环境首选)
这是你提到的代码生成工具采用的实现逻辑,无兼容性风险,性能最优,是生产场景的首选方案。
实现步骤:
- 在项目中集成代码生成工具,新增编译前置脚本,每次构建前自动运行工具扫描全项目代码
- 编写规则模板,遍历所有遵守
PreviewProvider的结构体,自动生成汇总代码,你提到的模板规则即可直接使用:
{% for type in types.based.PreviewProvider %}
- 自动生成的最终代码可直接在业务逻辑中调用,示例生成结果如下:
enum PreviewProviderLoader { /// 所有遵守PreviewProvider的结构体类型集合 static var allPreviewStructs: [PreviewProvider.Type] = [ HomePageView_Previews.self, UserProfileView_Previews.self, SettingsView_Previews.self ] /// 所有结构体的_allPreviews属性汇总 static var allPreviews: [Any] { allPreviewStructs.flatMap { $0._allPreviews } } }
后续直接调用PreviewProviderLoader.allPreviews即可拿到所有目标结构体的_allPreviews属性内容。
方案2:运行时扫描(仅适合调试场景)
Swift值类型默认不会注册到ObjC运行时,所以你现有的基于ObjC Runtime的类查询方案无法直接复用,可通过解析Mach-O文件的Swift元数据段实现运行时扫描:
- 读取当前App二进制的
__TEXT.__swift5_types段,获取所有Swift类型的元数据指针 - 过滤出类型Kind为结构体的元数据
- 遍历判断每个结构体是否遵守目标
PreviewProvider协议
该方案依赖Swift内部未公开的ABI规则,不同Swift版本可能出现兼容性问题,且存在App Store审核风险,仅建议在内部调试工具中使用。
内容的提问来源于stack exchange,提问作者user9015472
相关产品推荐
相关产品推荐

