web-dev-qa-db-ja.com

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

以下のように複数の行にまたがって文字列を分割する方法を教えてください。

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

Swift 4では 複数行の文字列リテラル がサポートされています。改行の他に、エスケープされていない引用符を含めることができます。

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

Swiftの古いバージョンでは、複数行に渡って単一のリテラルを持つことはできませんが、複数行に渡ってリテラルを一緒に追加することができます。

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

私はコンパイラのハングバグを回避しながら、複数行の文字列を達成するために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!"
30
mcornell

これは私が気づいたSwiftについての最初の残念なことでした。ほとんどすべてのスクリプト言語で複数行の文字列を使用できます。

C++ 11では、独自のターミネータを定義できる ことを可能にする生の文字列リテラルが追加されました

C#には、複数行の文字列に対して @リテラル があります。

普通の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"
27
Andy Dent

Litsoが指摘しているように、1つの式で+-演算子を繰り返し使用すると、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"])
16
Jonas Reinsch

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の新機能 を参照してください。

15
TwoStraws

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)
9
Nareshkumar Nil

スイフト:

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

例:

print("First line\nSecond Line\rThirdLine...")
5
Juan Boero

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

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

次の例は、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)
    .
    .
    .
3
clearlight

Enterまたは\nにunicode equalsを使用して、それらを文字列の中に実装できます。例えば、\u{0085}です。

0
hooman

これは、文字列を複数の行で区切られた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
            }
        }

    }
}
0
Michael N

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

お役に立てれば!

0
B-Rad

サンプル

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

場合によっては、+演算子が適切ではないと思われます。

0
Danielle Cohen

もう1つの方法は、文字列変数を定義済みテキストと一緒に使用したい場合です。

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