String Swift-在多行上拆分字符串

String Swift-在多行上拆分字符串,string,swift,String,Swift,如何将字符串拆分为多行,如下面所示 var text:String = "This is some text over multiple lines" Swift 4包括对以下各项的支持:。除了换行符,它们还可以包含未替换的引号 var text = """ This is some text over multiple lines """ 较旧版本的Swift不允许在多行上使用单个文字,但可以在多行上将文字添加到一起: var

如何将字符串拆分为多行,如下面所示

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

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#对多行字符串有自己的定义

甚至是普通C,因此老式C++和Objule-C只允许通过将多个文本相邻,从而引号被折叠。执行此操作时,空格不计算在内,因此可以将它们放在不同的行上(但需要添加自己的换行):

由于斯威夫特不知道您已经将文本放在多行上,因此我必须修复connor的示例,类似于我的C示例,明确说明换行:

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

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

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!"
扩展字符串{
初始化(sep:String,uu行:String…){
self=“”
对于行中的(idx,item)。枚举(){
自我+=“\(项目)”
如果idx
正如litso所指出的,在一个表达式中重复使用
+
-运算符可能导致XCode Beta挂起(仅使用XCode 6 Beta 5进行检查):

现在多行字符串的另一种选择是使用字符串数组,并使用
+
减少它:

var text = ["This is some text ",
            "over multiple lines"].reduce("", +)
或者,可以说更简单,使用
join

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

下面的示例描述了多行连续性,使用括号作为Swift bug的简单解决方案,如XCODE 6.2 beta版,其中抱怨表达式太复杂,无法在合理的时间内解决,并考虑将其分解成更小的部分:

    .
    .
    .
    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)
    .
    .
    .

您可以将unicode equals用于enter或
\n
并在字符串中实现它们。例如:
\u{0085}

添加到@Connor answer,还需要\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
样品


如果您觉得+运算符不合适,我尝试了几种方法,但找到了更好的解决方案: 只需使用“文本视图”元素。它的文本自动显示多行!
在这里找到:

Swift:

@connor是正确的答案,但是如果您想在打印语句中添加行,您要查找的是
\n
和/或
\r
,这些被称为转义序列或转义字符

例如:

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

一种方法是将标签文本设置为AttributeText,并更新字符串变量以包含换行符的HTML(

例如:

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

希望这有帮助

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

  • 您需要以三个双引号开始和结束字符串,
  • 字符串内容应该从它自己的行开始
  • 终止的
    “”“
    也应在其自己的行上启动
  • 除此之外,你可以走了!下面是一个例子:

    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通过提供多行字符串文字支持解决了此问题。要开始字符串文字,请添加三个双引号(“”),然后按return键,按return键后,开始使用任何变量编写字符串,换行符和双引号就像你在记事本或任何文本编辑器中写的一样。要再次结束多行字符串文字,请在新行中写入(“”)

    参见下面的示例

         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"
    )
    

    我相当肯定这方面有局限性。我尝试过将一个字符串拆分为13行(这是一个多行信息文本)。它不仅没有完成编译,而且还使我的Mac电脑崩溃了。正如我所说,我不能肯定地说这是一个问题,但要注意,影响是相当糟糕的。我甚至在编译之前就崩溃过多次。我认为负责语法突出显示和代码完成(我想)的“SourceKitService”进程也要对此崩溃负责。@DerekKnight这是一个编译器错误,而不是语言限制。如果它仍然存在,您应该提交一个雷达文件。@bluesm仅供参考:SourceKit是一个单独的进程,所以它不能使Xcode崩溃。它可以进行语法高亮显示和代码完成,没错,但目前,编译本身存在于Xcode的过程中——这就是为什么编译器错误有时会将Xcode自身删除的原因:(reduce版本在beta 6上对我起作用,但join抛出了一个例外。这种方法的问题是,在Swift中(从Xcode 6.2 beta开始),您很容易找到太多的“连续”行,它抱怨表达式“太复杂,无法在合理的时间内解决”并考虑把它分解成简单的表达式。这是很难但很容易完成的,只需把部分包在括号中。不要忘记在结束引用和+之间加上一个空格,否则你会得到一个“+”不是一个后缀一元运算符。错误此操作仍然有效,但您需要手动添加
    \n
    字符。例如,在REPL中:
    //: 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"
    )