Swift - 在多行上拆分字符串

Posted

技术标签:

【中文标题】Swift - 在多行上拆分字符串【英文标题】:Swift - Split string over multiple lines 【发布时间】:2014-07-28 06:41:36 【问题描述】:

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

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

【问题讨论】:

要自动将行转换为多行字符串,请参阅我在这个稍微相关的线程上的回答 How can you implement this multiline string literal macro in Swift? Swift version 【参考方案1】:

Swift 4 包括对multi-line string literals 的支持。除了换行符之外,它们还可以包含未转义的引号。

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

旧版本的 Swift 不允许您在多行中使用单个文字,但您可以在多行中添加文字:

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

【讨论】:

这种方法的问题是你很容易在 Swift 中达到太多的“连续”行(从 Xcode 6.2 beta 开始),它抱怨表达“太复杂而无法以合理的方式解决时间”,并考虑将其分解为更简单的表达式。这很丑陋但很容易完成,只需将部分包裹在括号中。 不要忘记在右引号和 + 之间添加一个空格,否则会出现“'+' is not a postfix unary operator”错误 这仍然有效,但您需要手动添加\n 字符。例如,在 REPL 中:println("foo\n" + "bar") 在不同的行上打印 foobar 它应该在 Xcode 7 中修复“Swift 字符串文字的连接,包括跨多行,是有保证的编译时优化,即使在 -Onone 时也是如此。”adcdownload.apple.com/WWDC_2015/Xcode_7_beta/… 不适用于使用字符串的枚举大小写值:(【参考方案2】:

我在 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.2 Swift 版本中,长文本的编译速度也很慢,而这些方法避免了这种开销。 对于使用 Swift 2 的任何人,enumerate(lines) 现在是 lines.enumerate() @mcornell 这很好,但joinWithSeparator 本质上不做同样的事情吗? ["Hello", "World!"].joinWithSeparator(", ")【参考方案3】:

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

C++11 添加了原始字符串字面量,让您可以define your own terminator

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"

【讨论】:

我很确定这有一些限制。我尝试将一个字符串拆分为 13 行(这是一个多行信息文本)。它不仅没有完成编译,而且还让我的 Mac 崩溃了。正如我所说,我不能断然地说这是一个问题,但请注意,影响非常糟糕。 在编译之前我已经崩溃过多次。我认为负责语法高亮和代码完成的“SourceKitService”进程(我想)也是导致崩溃的原因。 @DerekKnight 这是一个编译器错误,而不是语言限制。如果仍然存在,您应该提交 Radar。 @bluesm 仅供参考:SourceKit 是一个单独的进程,因此它不会使 Xcode 崩溃。它确实语法高亮和代码完成,正确,但目前,编译本身存在于 Xcode 的进程中 - 这就是为什么编译器错误有时会自行取消 Xcode :(【参考方案4】:

从 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!
"""

更多信息请参见what's new in Swift 4。

【讨论】:

不幸的是,这在 Xcode 8.3.3 Playground 中不起作用。我收到“未终止的字符串”错误。 正如我所说,此功能是 Swift 4 中的新功能 - 将 Swift 4 工具链安装到 Xcode 8.3.3 或安装 Xcode 9。【参考方案5】:

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

目前,多行字符串的另一种选择是使用字符串数组并将 reduce+ 一起使用:

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

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

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

【讨论】:

reduce 版本在 beta 6 上为我工作,但加入引发了异常。【参考方案6】:

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)

【讨论】:

【参考方案7】:

斯威夫特:

@connor 是正确的答案,但如果您想在打印语句中添加行,您正在寻找的是\n 和/或\r,这些称为转义序列或转义字符this is a link to Apple documentation on the topic.。

例子:

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

【讨论】:

这不是任何人想要的。我们希望能够在 源代码 中对字符串文字进行换行,而不是(必须)在渲染输出 中使用换行符。我认为,这在最初的问题中很清楚。得分为正的人显然明白。负分的人显然没有。 @ArtOfWarfare 这是我一直在寻找的答案,这个页面是搜索“新行快速字符串”时的最佳结果。显然,并没有你说的那么明显。【参考方案8】:

添加到@Connor 答案,还需要有 \n 。这是修改后的代码:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

您可以使用 unicode equals 输入或 \n 并在您的字符串中实现它们。例如:\u0085

【讨论】:

【参考方案12】:

样本

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

以防万一,您找不到合适的 + 运算符

【讨论】:

【参考方案13】:

一种方法是将标签文本设置为属性文本并更新字符串变量以包含用于换行的 html (&lt;br /&gt;)。

例如:

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)。【参考方案14】:

这里有一个代码 sn-p 将一个字符串分割为 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
            
        

    

【讨论】:

【参考方案15】:

我写的一个小扩展。

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

【讨论】:

【参考方案16】:

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

【讨论】:

(只是让你知道,否决票可能是因为问题是关于在代码中格式化,而不是在 UI 中......并且在你的答案中提供代码示例可能会使这一点更加明显)跨度>

以上是关于Swift - 在多行上拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中将字符串拆分为多行

在Oracle中将字符串拆分为多行

在Oracle中将字符串拆分为多行

如何将多行字符串拆分为多行?

多行上的 XML 拆分属性值

如何在 Bash 中将字符串拆分为多行?