如何将UI模块的Swift资源符号扩展设为公开供主App访问?
解决Swift资源符号扩展跨模块访问问题
方案一:通过Xcode配置直接修改访问级别
- 打开你的UI框架/模块项目,进入Build Settings页面
- 在搜索栏输入「Asset Symbol Access Level」,定位到对应配置项
- 将默认的
internal改为public(如果需要更开放的访问权限可以用open,但跨模块调用用public足够) - 重新编译框架,生成的
UIColor.myColor、UIImage.myImage这类扩展就会变为public级别,主App目标可直接调用
方案二:手动修改生成的扩展代码(临时救急)
如果找不到上述配置项或配置不生效,可手动调整自动生成的文件:
- 找到框架中自动生成的资源扩展文件(通常命名为
Assets.xcassets.generated.swift) - 将扩展的
internal修饰符替换为public,示例如下:// 修改前 internal extension UIColor { static let myColor = UIColor(named: "myColor")! } // 修改后 public extension UIColor { static let myColor = UIColor(named: "myColor")! } - 注意:这种方法的弊端是,每次重新生成资源扩展时,手动修改的内容会被覆盖,因此优先推荐方案一的配置方式
额外注意事项
- 确保主App已正确依赖你的UI框架:在主App的General设置中,找到Frameworks, Libraries, and Embedded Content,将该UI框架添加进去
- 若使用Swift Package Manager,可在
Package.swift中配置访问级别,在资源处理参数里指定:targets: [ .target( name: "UIFramework", resources: [ .process("Assets.xcassets", generateAssetSymbols: .init(accessLevel: .public)) ] ) ]
内容的提问来源于stack exchange,提问作者Niall Mccormack
相关产品推荐
相关产品推荐

