如何在Swift中实现这个多行字符串文字宏?

Bra*_*son 52 objective-c swift

在我的GPUImage框架的Objective-C代码中,我有以下宏:

#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define SHADER_STRING(text) @ STRINGIZE2(text)
Run Code Online (Sandbox Code Playgroud)

这允许我在自定义过滤器子类中将多行顶点和片段着色器内联为NSString文字,如下所示:

NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING
(
 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 void main()
 {
     gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
 }
);
Run Code Online (Sandbox Code Playgroud)

GPUImage需要这样才能提供包含在过滤器子类正文中的格式化顶点和片段着色器.将它们作为单独的文件运送会使框架无法编译到静态库中.使用上面的宏,我可以使这些着色器能够在框架代码和外部着色器文件之间进行复制和粘贴,而无需进行大量的重新格式化工作.

Swift取消了编译器宏,文档中有这样说:

复杂的宏在C和Objective-C中使用,但在Swift中没有对应的.复杂的宏是不定义常量的宏,包括带括号的,类似函数的宏.您可以在C和Objective-C中使用复杂的宏来避免类型检查约束或避免重新输入大量的样板代码.但是,宏可能使调试和重构变得困难.在Swift中,您可以使用函数和泛型来实现相同的结果,而不会有任何妥协.因此,C和Objective-C源文件中的复杂宏不可用于Swift代码.

根据"在Swift中,您可以使用函数和泛型来实现相同的结果而不会有任何妥协",Swift中是否有一种方法可以提供多行字符串文字而无需求助于一串串联操作?

whi*_*and -1

看起来您的最终目标是避免包含独立的着色器文件?

如果是这样,一种技术是编写一个快速命令行实用程序,生成一个 .swift 文件,其中包含表示特定文件夹中着色器函数的字符串常量。

将生成的 .swift 文件包含在您的项目中,您就不会受到运行时损失,如果您生成代码得当,调试甚至会更容易。

可能需要不到一个小时,着色器不再需要宏。