You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift如何获取所有遵守指定protocol的struct及相关实现方案

回答

核心结论

  • 可以获取所有遵守指定protocol的struct
  • 主流可行方案分为编译期代码生成和运行时私有接口调用两类

方案详情

方案1:编译期代码生成(生产环境首选)

这是你提到的代码生成工具采用的实现逻辑,无兼容性风险,性能最优,是生产场景的首选方案。
实现步骤:

  1. 在项目中集成代码生成工具,新增编译前置脚本,每次构建前自动运行工具扫描全项目代码
  2. 编写规则模板,遍历所有遵守PreviewProvider的结构体,自动生成汇总代码,你提到的模板规则即可直接使用:
{% for type in types.based.PreviewProvider %}
  1. 自动生成的最终代码可直接在业务逻辑中调用,示例生成结果如下:
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元数据段实现运行时扫描:

  1. 读取当前App二进制的__TEXT.__swift5_types段,获取所有Swift类型的元数据指针
  2. 过滤出类型Kind为结构体的元数据
  3. 遍历判断每个结构体是否遵守目标PreviewProvider协议
    该方案依赖Swift内部未公开的ABI规则,不同Swift版本可能出现兼容性问题,且存在App Store审核风险,仅建议在内部调试工具中使用。

内容的提问来源于stack exchange,提问作者user9015472

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:09:01