Swift-文字列を複数行に分割


265

以下のように文字列を複数の行に分割するにはどうすればよいですか?

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

行を複数行の文字列に自動的に変換するには、このわずかに関連するスレッドで私の回答を参照してください。この複数行文字列リテラルマクロをSwiftに実装するにはどうすればよいですか?
holroy

回答:


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ベータの時点で)簡単に到達でき、式が「妥当な時間で解決するには複雑すぎる」と不満があり、中断を検討することです。単純な表現にそれをダウンさせます。これは醜いですが、簡単に達成できます。セクションを括弧で囲みます。
clearlight 2014

8
閉じ引用符と+の間にスペースを追加することを忘れないでください。そうしないと、「 '+'は後置単項演算子ではありません」というエラーが発生します
Orlin Georgiev

これでも機能しますが、手動で\nキャラクターを追加する必要があります。例えば、REPLに:println("foo\n" + "bar")プリントfoobar別の行に。
Brian Gerstle

それは、「複数行に渡っ含め、連結スウィフトの文字列リテラル、でもで-Onone、保証コンパイル時の最適化である。」Xcodeで7を固定する必要がありますadcdownload.apple.com/WWDC_2015/Xcode_7_beta/...
Kostiantynコバール

2
文字列を使用する列挙型のケース値では機能しません:(
Lars Blumberg '28

32

Stringの拡張機能を使用して、コンパイラのハングアップバグを回避しながら複数行の文字列を実現しました。また、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!"

1
これらの方法は完璧です。最新の1.2 Swiftリリースでも、長いリテラルのコンパイルは非常に遅く、これらのメソッドはそのオーバーヘッドを回避します。
ファットマン、2015年

2
Swift 2を使用している人にとってenumerate(lines)は今ですlines.enumerate()
Jedidja '30 / 09/30

2
@mcornellこれはいいですが、joinWithSeparator本質的に同じことをしませんか?["Hello", "World!"].joinWithSeparator(", ")
Dan Loewenherz、2016

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 FYI:SourceKitは独立したプロセスであるため、Xcodeをクラッシュさせることはできません。構文の強調表示とコードの補完を行いますが、現時点では、コンパイル自体がXcodeのプロセスに存在します。そのため、コンパイラのバグによってXcodeがダウンすることがあります:(
radex

17

Swift 4.0以降では複数行の文字列が可能ですが、いくつかのルールがあります。

  1. 3つの二重引用符で文字列を開始および終了する必要があります"""
  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では機能しません。「終了していない文字列」エラーが発生します。
James Foster

私が言ったように、この機能はスウィフト4で新しく追加された-のXcode 8.3.3へスウィフト4ツールチェーンをインストールしたり、Xcodeの9をインストールするのいずれか
TwoStraws

16

litsoが指摘したように、+1つの式で-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"])

ベータ6では削減バージョンが機能しましたが、結合によって例外がスローされました。
Tristan Warner-Smith

9

Swift 4は、マルチライン文字列リテラルのサポートを提供することでこの問題に対処しました。文字列リテラルを開始するには、3つの二重引用符(”””)を追加して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)

5

迅速:

@connorが正しい答えですが、探しているものを印刷ステートメントに追加したい場合、\nおよび/または\rこれらはエスケープシーケンスまたはエスケープ文字と呼ばれ、これはトピックに関するAppleのドキュメントへのリンクです。

例:

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

6
これは誰もが望んでいることではありません。文字列リテラルのソースコードに改行を入れられるようにしたいのですが、レンダリングされた出力に改行を入れる必要はありません。これは元の質問ではかなり明確だったと思います。正のスコアを持つ人々は明らかに理解しました。負のスコアを持つ人々は明らかにしませんでした。
ArtOfWarfare 2016

5
@ArtOfWarfareこれは私が探していた答えであり、このページが「改行の迅速な文字列」を検索したときの一番の結果でした。言うまでもなく、それはあなたが言うほど明白ではありません。
ジョンRペリー

4

@Connorの回答に加えて、\ nも必要です。ここに改訂されたコードがあります:

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

3

次の例は、Xcode 6.2ベータ版の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

EnterまたはUnicodeの等号を使用し\nて文字列内に実装できます。次に例を示します\u{0085}



0

1つの方法は、ラベルテキストをattributedTextに設定し、文字列変数を更新して改行用のHTMLを含めることです(<br />)。

例えば:

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

出力:

This is some text
over multiple lines

お役に立てれば!


プロパティ(label.attributedText)にString値(テキスト)を割り当てることはできませんNSAttributedString?
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複数行


(ご存知のように、反対票はおそらく、UIではなくコードでのフォーマットに関する質問でした。回答にコードサンプルを提供することで、おそらくこれがより明白になったでしょう)
benc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.