如何在Xcode项目中访问在Swift包中声明的成员?
我在为他人使用而构建一个框架。这个框架本身不是用SPM构建的,而是用Xcode构建的。(它有一个.xcodeproj文件。)
现在我想在这个框架中使用宏。据我所知,宏的实现和声明必须都在一个Swift Package中。因此我用 --type macro 创建了一个新的Swift Package,并把它作为框架的本地包依赖加入。
由于宏的声明是公开的,使用我的框架的用户也将能够通过导入该Swift Package中的模块来使用宏。这点是不可取的。
我发现 package access modifier 似乎就是为了解决这个问题而设计的。它应该允许组成同一个“包”的不同模块互相访问对方的代码。它似乎并不限于SPM项目,因为它提到
Swift作为一种语言,把定义包边界的权力交给构建系统。
所以我猜在Xcode中存在某些构建设置,允许我把SPM包包含起来,使其被视为与Xcode框架目标相同的“包”。
我找到了一个名为 SWIFT_PACKAGE_NAME 的构建设置,听起来很有希望:
一个标识符,用于将具有包访问修饰符符号访问权限的模块分组。
但我不知道该把它设为什么。我尝试把它设置为包含宏的Swift包的同名(在Package.swift中作为传入给 Package.init 的第一个参数的名称),但我仍然无法访问 package 符号。
我还能怎么做,才能防止使用我的框架的用户访问它所依赖的Swift Package?
解决方案
package 实际上是Swift中所有成员和类型的默认可用性设置。它使声明对当前包可用(例如,应用目标或包目标,而不是整个包模块)。没有办法区分来自远程依赖的目标和同目录中的目标。
解决方案是将你的二进制编译成xcframework,它只会让导出目标的公共成员对消费端可见。请参阅这个论坛帖子,发帖者的问题正是你想要发生的情况。