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

2023-12-21

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

#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define SHADER_STRING(text) @ STRINGIZE2(text)

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

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

 uniform sampler2D inputImageTexture;

 void main()
 {
     gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
 }
);

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

Swift 取消了编译器宏和文档有话要说 https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_13:

C 和 Objective-C 中使用了复杂宏,但没有对应的宏 在斯威夫特.复杂宏是没有定义常量的宏, 包括带括号的类似函数的宏。您使用复杂的宏 在 C 和 Objective-C 中以避免类型检查约束或避免 重新输入大量样板代码。然而,宏可以使 调试和重构困难。在 Swift 中,您可以使用函数 和仿制药可以在不做任何妥协的情况下达到相同的结果。 因此,C 和 Objective-C 源代码中的复杂宏 文件不可用于您的 Swift 代码。

根据“在 Swift 中,您可以使用函数和泛型来实现相同的结果而无需任何妥协”这一行,Swift 中是否有一种方法可以提供多行字符串文字,而无需诉诸字符串连接操作?


唉,据我所知,Swift 多行字符串仍然不可用。然而,在对此进行一些研究时,我发现了一种可能有用的解决方法。它是以下项目的组合:

  • 在 Playground 中引用 Swift 字符串的快速技巧 http://gothick.org.uk/2014/12/10/a-quick-hack-to-quote-swift-strings-in-a-playground/- 描述如何提供替换和修复文本的服务
  • Pyrtsa 的评论,关于使用"\n".join(...)模拟多行字符串

设置自动化服务

Using 自动机你可以设置一个额外的service具有以下属性:

  • “运行 Shell 脚本”的单个操作
  • 勾选“输出替换所选文本”
  • 将外壳更改为/usr/bin/perl
  • 将下面的代码摘录添加到操作窗口
  • 另存为“替换为带引号的快速多行连接”

代码摘录

print "\"\\n\".join([\n";   # Start a join operation

# For each line, reformat and print
while(<>) {
  print "    ";         # A little indentation 
  chomp;                # Loose the newline
  s/([\\\"])/\\$1/g;    # Replace \ and " with escaped variants
  print "\"$_\"";       # Add quotes around the line 

  print "," unless eof  # Add a comma, unless it is the last line
  print "\n";           # End the line, preserving original line count
 }

print "  ])"; # Close the join operation

你当然可以自由地使用你想要的任何 shell 和代码,我选择了我熟悉的 perl,这里有一些评论:

  • 我用的是"\n".join(...)版本来创建多行字符串,您可以使用来自的扩展答案Swift - 将字符串拆分为多行 https://stackoverflow.com/a/25004154/1548472,甚至是+变体,我将把它作为用户的练习
  • 我选择用空格稍微缩进,并替换\ and "让它更坚固一点
  • 注释当然是可选的,您可能可以稍微缩短代码。我尝试选择清晰度和可读性
  • 代码按原样保留空格,但如果不需要,可以进行编辑。也留给用户作为练习

服务的使用

打开你的 Playground 或代码编辑器,然后插入/写入一些多行文本:

  • 标记文本块
  • Execute Xcode(或类似)> 服务 > 替换为引用的 swift 多行连接

您现在已经有了一个采用正确的快速编码的多行字符串。以下是前后文本的示例:

Here is my multiline text 
example with both a " and
a \ within the text

"\n".join([
    "Here is my multiline text ",
    "example with both a \" and",
    "a \\ within the text"
  ])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐