Swift中字符串的类似Heredoc的语法

时间:2014-12-10 22:30:09

标签: swift

Swift中是否存在字符串的替代语法?我需要复制/粘贴包含大量引号的文本块,并且每次都是一种痛苦的转义。

我正在寻找类似PHP的heredoc语法或Python的三重引用字符串。与this question类似,但我不关心换行符,我只需要忽略引号和反斜杠。

这是我现在面临的灾难的一个具体例子:

let pattern = "(?:\["(this|is|a|pain|to|escape|properly)+)",0(?:,\[10\])?\])" // that makes me sad
let json = "window.google.ac.h(["this",[["is",0],["even",0],["worse",0]],{"q":"...","k":1}])" // that makes me cry

感谢。

3 个答案:

答案 0 :(得分:6)

As with Objective C, there's no syntax for this in the language。此刻,弦乐必须至少逃脱。另一种方法是从资源文件加载字符串。

我在这个问题上向Apple提出错误报告;只有你找到的原因才会对语言有所帮助,因为你可以在操场/ REPL中更加动态地执行Swift,所以还有更多的理由想要你正在玩的时候将任意东西粘贴到字符串常量中。

附录:作为快速黑客的练习,我只是在Automator中敲了一个快速而脏的服务菜单项,用于在操场上引用字符串。这超出了此Stack Overflow答案的范围,但I documented it on my blog

答案 1 :(得分:3)

斯威夫特并不支持它,但C++11 does。我们可以轻松地将其导入Swift,如NSString s。

StringConst.h:

#import <Foundation/Foundation.h>

extern NSString *const STR_PATTERN;
extern NSString *const STR_JSON;

StringConst.mm:

#import "StringConst.h"

NSString * const STR_PATTERN = @R"""((?:\["(this|is|a|pain|to|escape|properly)+)",0(?:,\[10\])?\]))""";
NSString * const STR_JSON = @R"""(window.google.ac.h(["this",[["is",0],["even",0],["worse",0]],{"q":"...","k":1}]))""";

&lt;目标&GT; -Bridging-Header.h:

#import "StringConst.h"

AnySwift.swift:

println(STR_PATTERN)
println(STR_JSON)

添加了:

要在Playground中使用它,您必须在其中创建一个Framework项目和Playground文件。

sceenshot

答案 2 :(得分:1)

此功能已于2017年添加到Swift。(SE 0168 Multi-Line String Literals

Swift Documentation: Welcome to Swift: Simple Values说:

  

对于占用字符串,请使用三个双引号(""")   多行。每条引用行开头的缩进为   删除,只要它与结束的缩进匹配   引号。例如:

let quotation = """
I said "I have \(apples) apples."
And then I said "I have \(apples + oranges) pieces of fruit."
"""

根据comment上的Swift three double quotes,“这是Swift 4和Xcode 9的全新功能。”

有关更多详细信息,请参见Swift Documentation: Language Guide: Strings and Characters: String Literals: Multiline String Literals