Swift -多行分割字符串

我怎么能在多行分割字符串,如下面?

var text:String = "This is some text
over multiple lines"
157239 次浏览

Swift 4包括对多行字符串字面量的支持。除了换行符,它们还可以包含未转义的引号。

var text = """
This is some text
over multiple lines
"""

旧版本的Swift不允许你在多行上有一个字面值,但你可以在多行上添加字面值:

var text = "This is some text\n"
+ "over multiple lines\n"

这是我注意到的斯威夫特的第一件令人失望的事情。几乎所有脚本语言都允许多行字符串。

c++ 11添加了原始字符串字面量,允许你定义自己的终止符

c#有@literals用于多行字符串。

即使是普通的C以及老式的c++和Objective-C也允许通过将多个文字相邻放置来进行连接,因此引号被折叠。当你这样做的时候,空格不算数,所以你可以把它们放在不同的行上(但需要添加你自己的换行符):

const char* text = "This is some text\n"
"over multiple lines";

由于swift不知道你已经把你的文本超过多行,我必须修复connor的样本,类似于我的C样本,显式地声明换行:

var text:String = "This is some text \n" +
"over multiple lines"

我在String上使用了一个扩展来实现多行字符串,同时避免编译器挂起的错误。它还允许您指定分隔符,以便您可以像使用Python的join函数一样使用它

extension String {
init(sep:String, _ lines:String...){
self = ""
for (idx, item) in lines.enumerated() {
self += "\(item)"
if idx < lines.count-1 {
self += sep
}
}
}


init(_ lines:String...){
self = ""
for (idx, item) in lines.enumerated() {
self += "\(item)"
if idx < lines.count-1 {
self += "\n"
}
}
}
}






print(
String(
"Hello",
"World!"
)
)
"Hello
World!"


print(
String(sep:", ",
"Hello",
"World!"
)
)
"Hello, World!"

正如litso所指出的,在一个表达式中重复使用+-Operator可能会导致Xcode Beta挂起(刚刚用Xcode 6 Beta 5检查过)

目前,多行字符串的另一种替代方法是使用字符串数组,并将其与+一起reduce:

var text = ["This is some text ",
"over multiple lines"].reduce("", +)

或者,可以说更简单,使用join:

var text = "".join(["This is some text ",
"over multiple lines"])

下面的例子描述了一个多行连续,使用圆括号作为一个简单的解决方法,以解决Xcode 6.2 Beta版本的Swift错误,它抱怨表达式太复杂,无法在合理的时间内解析,并考虑将其分解为更小的片段:

    .
.
.
return String(format:"\n" +
("    part1:    %d\n"    +
"    part2:    %d\n"    +
"    part3:  \"%@\"\n"  +
"    part4:  \"%@\"\n"  +
"    part5:  \"%@\"\n"  +
"    part6:  \"%@\"\n") +
("    part7:  \"%@\"\n"  +
"    part8:  \"%@\"\n"  +
"    part9:  \"%@\"\n"  +
"    part10: \"%@\"\n"  +
"    part12: \"%@\"\n") +
"    part13:  %f\n"     +
"    part14:  %f\n\n",
part1, part2, part3, part4, part5, part6, part7, part8,
part9, part10, part11, part12, part13, part14)
.
.
.

你可以为enter或\n使用unicode equals并在你的字符串中实现它们。例如:\u{0085}

加上@Connor的回答,也需要有\n。以下是修改后的代码:

var text:String = "This is some text \n" +
"over multiple lines"

另一种方法是,如果你想使用带有预定义文本的字符串变量,

var textFieldData:String = "John"
myTextField.text = NSString(format: "Hello User, \n %@",textFieldData) as String
myTextField.numberOfLines = 0

样本

var yourString = "first line \n second line \n third line"

以防您发现+运算符不合适

我尝试了几种方法,但找到了一个更好的解决方案: 只需使用“文本视图”元素。它的文本自动显示多行! UITextField多行

迅速:

@connor是正确答案,但如果你想在打印语句中添加行,你要找的是\n和/或\r,这些被称为转义序列或转义字符,这是关于该主题的苹果文档的链接。

例子:

print("First line\nSecond Line\rThirdLine...")

一种方法是将标签文本设置为attributedText,并更新字符串变量以包括用于换行的HTML (<br />)。

例如:

var text:String = "This is some text<br />over multiple lines"
label.attributedText = text

输出:

This is some text
over multiple lines

希望这能有所帮助!

从Swift 4.0开始,可以使用多行字符串,但有一些规则:

  1. 你需要用三个双引号"""开始和结束你的字符串。
  2. 你的字符串内容应该从它自己的行开始。
  3. 结束"""也应该在自己的行上开始。

除此之外,你就可以开始了!这里有一个例子:

let longString = """
When you write a string that spans multiple
lines make sure you start its content on a
line all of its own, and end it with three
quotes also on a line of their own.
Multi-line strings also let you write "quote marks"
freely inside your strings, which is great!
"""

更多信息请参见Swift 4有什么新功能

Swift 4通过提供多行字符串文字支持解决了这个问题。要开始字符串字面量,添加三个双引号(" " " ")并按回车键,按回车键后开始写带有任何变量的字符串,换行符和双引号,就像你在记事本或任何文本编辑器中写的那样。要结束多行字符串文字再次写入(" " ")在新行。

参见下面的例子

     let multiLineStringLiteral = """
This is one of the best feature add in Swift 4
It let’s you write “Double Quotes” without any escaping
and new lines without need of “\n”
"""


print(multiLineStringLiteral)

下面是一个代码片段,用n个字符分隔字符串:

//: A UIKit based Playground for presenting user interface


import UIKit
import PlaygroundSupport


class MyViewController : UIViewController {
override func loadView() {


let str = String(charsPerLine: 5, "Hello World!")
print(str) // "Hello\n Worl\nd!\n"


}
}


extension String {


init(charsPerLine:Int, _ str:String){


self = ""
var idx = 0
for char in str {
self += "\(char)"
idx = idx + 1
if idx == charsPerLine {
self += "\n"
idx = 0
}
}


}
}

我写了一个小扩展。

extension String {


init(swiftLintMultiline strings: String...) {
self = strings.reduce("", +)
}
}

你可以这样使用它:

String(swiftLintMultiline:
"Lorem ipsum dolor sit amet, consectetur adipiscing",
"elit. Ut vulputate ultrices volutpat. Vivamus eget",
"nunc maximus, tempus neque vel, suscipit velit.",
"Quisque quam quam, malesuada et accumsan sodales,",
"rutrum non odio. Praesent a est porta, hendrerit",
"lectus scelerisque, pharetra magna. Proin id nulla",
"pharetra, lobortis ipsum sit amet, vehicula elit. Nulla",
"dapibus ipsum ipsum, sit amet congue arcu efficitur ac. Nunc imperdi"
)

下面是一个简单的实现(Swift 5.4+),使用resultBuilder来清理语法!

@resultBuilder
public struct StringBuilder {
public static func buildBlock(_ components: String...) -> String {
return components.reduce("", +)
}
}


public extension String {
init(@StringBuilder _ builder: () -> String) {
self.init(builder())
}
}

用法:

String {
"Hello "
"world!"
}
// "Hello world!"