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

如何在Swift中创建可按需导入的子模块?

解决Swift中Common模块按需子模块导入的方案

针对你遇到的Common模块臃肿、想实现类似Objective-C module map的子模块导入需求,结合Swift的特性和项目模块化最佳实践,给你几个可行的方案:

1. 拆分Common为独立子Target(最推荐)

这是最贴合Swift模块化设计的方案,能从根本上解决体积膨胀和冗余依赖的问题:

  • 把Common里的API、PurchaseCheckout等独立功能拆分成单独的Framework Target,比如CommonAPI、CommonPurchaseCheckout;如果还有通用基础代码(比如工具类、基础模型),可以抽成一个更小的CommonCore Target,让其他子Target依赖它。
  • 上层模块(比如Product1、你的轻量SDK)就可以按需导入:import CommonAPI,每个子Target只包含对应功能的代码和必要的CocoaPods依赖,完全不会引入无关内容。
  • 优点:依赖关系清晰,编译产物轻量化,精准控制依赖;长期维护更简单,新增功能可以直接加新的子Target。
  • 缺点:需要调整现有项目的Target结构,初期有一定迁移成本,但对项目长期健康很有帮助。

2. 用@_exported实现伪子模块导入(临时过渡方案)

如果暂时不想拆分Target,想先实现类似的导入语法,可以试试Swift的@_exported特性(注意这是带下划线的私有API,未来可能有变动):

  • 在Common模块内按功能分组(比如API组、PurchaseCheckout组),然后为每个组创建一个聚合文件,比如CommonAPI.swift,用@_exported批量导出该组的所有类型:
    @_exported import struct Common.FileDownloadAPI
    @_exported import struct Common.FileUploadAPI
    // 导出该组所有需要公开的类型
    
  • 然后在Common的module.modulemap中添加子模块定义(Swift模块也支持modulemap):
    module Common {
        module API {
            header "CommonAPI.h" // 可以创建一个空的头文件,若有OC代码则用实际头文件
            export *
        }
        module PurchaseCheckout {
            header "CommonPurchaseCheckout.h"
            export *
        }
    }
    
  • 这样你就能用import Common.API的语法导入整个组的类型,但注意:这个方案只是简化了导入语法,并没有减少编译体积——整个Common模块还是会被链接到目标产物中,也无法解决冗余依赖的问题,适合暂时不想大改结构的过渡场景。

3. 用Swift Package Manager(SPM)拆分模块

如果你们项目可以兼容SPM,这是更现代化的方案:

  • 把Common的子功能拆成SPM包的多个Target,比如在Package.swift中定义:
    let package = Package(
        name: "Common",
        products: [
            .library(name: "CommonAPI", targets: ["CommonAPI"]),
            .library(name: "CommonPurchaseCheckout", targets: ["CommonPurchaseCheckout"]),
            .library(name: "CommonCore", targets: ["CommonCore"]),
        ],
        targets: [
            .target(name: "CommonCore", dependencies: []),
            .target(name: "CommonAPI", dependencies: ["CommonCore"]),
            .target(name: "CommonPurchaseCheckout", dependencies: ["CommonCore"]),
        ]
    )
    
  • 上层项目(包括你的轻量SDK)可以按需引入需要的Product,SPM的依赖管理更轻量化,能精准控制每个子模块的依赖,避免冗余的CocoaPods依赖。

方案对比总结

方案解决体积问题解决冗余依赖语法友好度长期维护性
拆分独立Target✅✅✅✅
@_exported伪子模块❌❌✅⚠️(依赖私有API)
SPM拆分模块✅✅✅✅

如果你核心需求是打造轻量SDK、减少体积和冗余依赖,拆分独立Target或者SPM拆分模块是最优选择,完全能替代Objective-C module map的子模块导入效果,同时符合Swift的生态设计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:31:35