Swift-将字符串拆分为多行


Answers:


444

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

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

较早版本的Swift不允许您在多行上使用单个文字,但可以在多行上将文字添加在一起:

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

2
这种方法的问题是,您很容易在Swift(从Xcode 6.2 beta版开始)中到达太多“连续”行,在该行中抱怨该表达式“太复杂而无法在合理的时间内解决”,并考虑中断简化为更简单的表达式。这很丑陋,但很容易完成,只需将部分包装在括号中即可。
2014年

8
不要忘了在右引号和+之间添加空格,否则您将收到“'+'不是后缀一元运算符”错误
Orlin Georgiev 2015年

这仍然有效,但是您需要手动添加\n字符。例如,在REPL中:println("foo\n" + "bar")打印foobar在单独的行上。
Brian Gerstle

应该固定在Xcode 7“夫特级联字符串文本,包括多行,是有保证的编译时优化,即使在-Onone,” adcdownload.apple.com/WWDC_2015/Xcode_7_beta/...
Kostiantyn科瓦尔

2
对于使用字符串的枚举大小写值不起作用:(
Lars Blumberg 2015年

32

我使用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!"

1
这些方法是完美的。即使在最新的1.2 Swift版本中,长字面量也编译得很慢,而且这些方法避免了这种开销。
phatmann

2
对于使用Swift 2的任何人,enumerate(lines)现在都是lines.enumerate()
Jedidja

2
@mcornell这很好,但实际上做的不是joinWithSeparator相同的吗?["Hello", "World!"].joinWithSeparator(", ")
Dan Loewenherz

27

这是我注意到的关于Swift的第一个令人失望的事情。几乎所有的脚本语言都允许多行字符串。

C ++ 11添加了原始字符串文字,使您可以定义自己的终止符

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

即使是普通C语言,也因此是老式C ++和Objective-C,只要将多个文字放在相邻位置就可以实现合并,因此引号会被折叠。当您这样做时,空格不计算在内,因此您可以将它们放在不同的行上(但需要添加自己的换行符):

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

由于swift不知道您已将文本放在多行上,因此我不得不像我的C示例一样修复connor的示例,明确指出换行符:

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

4
我相当确定这是有限制的。我尝试将字符串拆分成13行(这是多行信息文本)。它不仅无法完成编译,而且使我的Mac屈服了。正如我说的那样,我不能断言这是一个问题,但是请注意,其影响是非常严重的。
德里克·奈特

即使在编译之前,我也崩溃了多次。我认为负责语法高亮显示和代码完成(我想)的“ SourceKitService”过程也应对此崩溃负责。
Paul Brewczynski 2014年

@DerekKnight这是一个编译器错误,而不是语言限制。如果仍然存在,则应提交雷达。
radex 2014年

@bluesm仅供参考:SourceKit是一个单独的进程,因此它不会崩溃Xcode。它确实进行了语法高亮显示和代码完成,但是现在,编译本身仍然存在于Xcode的过程中-这就是为什么有时编译器错误会自行
删除

17

从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中的新增功能


不幸的是,这在Xcode 8.3.3 Playground中不起作用。我收到“未终止的字符串”错误。
詹姆斯·福斯特

正如我所说的,这个功能在夫特4新-无论是安装一个夫特4工具链成的Xcode 8.3.3或安装的Xcode 9.
TwoStraws

16

正如+litso 指出的,在一个表达式中重复使用-Operator会导致XCode Beta挂起(仅通过XCode 6 Beta 5进行检查): Xcode 6 Beta无法编译

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

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

或者,可以说更简单一些join

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

精简版对我有效,适用于Beta 6,但该联接引发了异常。
Tristan Warner-Smith

9

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)

5

迅速:

@connor是正确的答案,但是如果您想在打印语句中添加所需的行\n和/或\r,则将它们称为“转义序列”或“转义字符”,这是该主题的Apple文档的链接。

例:

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

6
这不是任何人想要的。我们希望能够在字符串文字的源代码中包含换行符,而不(必须)在呈现的输出中包含换行符。我认为这在原始问题中非常清楚。分数为正的人显然可以理解。分数为负的人显然没有。
ArtOfWarfare 2016年

5
@ArtOfWarfare这是我一直在寻找的答案,并且此页面是搜索“换行快速字符串”时的最高结果。显然,它并不像您所说的那么明显。
约翰·佩里


3

以下示例描述了多行延续,使用括号作为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)
    .
    .
    .

0

如果要在预定义的文本中使用字符串变量,可以使用另一种方法,

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

0

您可以使用unicode等于来输入或\n在字符串中实现它们。例如:\u{0085}



0

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

例如:

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

输出:

This is some text
over multiple lines

希望这可以帮助!


您不能将String值(文本)分配给NSAttributedString?属性(label.attributedText)。
Maxime Ashurov,

0

这是一个代码片段,用于将字符串分隔为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
            }
        }

    }
}

-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.