Xcode 16.2:如何使Package中资产生成的Swift符号设为public?
如何让Xcode为Package资源生成public访问级别的扩展?
从Xcode 15开始,编译器会自动为资源目录中的资产(如颜色、图片)生成静态变量。例如在名为MyLibrary的Package中添加了ColorTestInsidePackage颜色资源,Package配置如下:
// swift-tools-version: 6.0 import PackageDescription let package = Package( name: "MyLibrary", platforms: [ .iOS(.v17), ], products: [ .library( name: "MyLibrary", targets: ["MyLibrary"]), ], targets: [ .target( name: "MyLibrary", resources: [ .process("Resources") ]), ] )
在Package内部可通过三种方式访问该颜色:
import SwiftUI public final class TestClass { let colorResource = ColorResource.colorTestInsidePackage let color = Color(.colorTestInsidePackage) let colorFromExtension = Color.colorTestInsidePackage }
其中Color.colorTestInsidePackage是通过资源目录设置中强制生成的扩展实现的,但外部应用或其他Package访问这些资产时会触发编译错误——因为自动生成的扩展默认使用internal访问修饰符,外部无法访问。
需求场景:在Package中搭建UI组件库和设计系统,让内部组件与外部应用均可直接使用这些共享颜色资源,无需重复导入资产库。
解决方案
有两种方式可以让编译器生成public级别的资源扩展:
方法1:通过Package配置全局设置
在Package的target配置中,为资源添加access: .public参数,编译器会为该目标下所有资源自动生成public级别的扩展:
.target( name: "MyLibrary", resources: [ .process("Resources", access: .public) ]),
方法2:针对单个资源目录手动配置
- 打开Package中的
.xcassets资源目录 - 选中目录本身,打开右侧检查器(Inspector)
- 在「Code Generation」区域,将「Access Level」从默认的
Internal修改为Public
完成上述任一设置后,生成的Color、Image等扩展会带有public修饰符,外部目标导入你的Package后,即可直接通过Color.colorTestInsidePackage这类语法访问资源。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

