Swiftの複数行Stringリテラルまとめ

\nをやらなくてもよい

samekard
Swift・iOSコラム
4 min readFeb 3, 2019

--

今更ながらSwiftの複数行Stringリテラルを知ってわりと喜ばしいので、ここにまとめる。

Swiftのバージョンは4.2

基本

3つのダブルクオテーションで次のように囲む。

let sampleString = """
あいうえお
かきくけこ
さしすせそ
"""

これは従来の方式で表した次のものと同等である。

"あいうえお\nかきくけこ\nさしすせそ"

ソースコード上の改行が生成物に残る。注意すべきことは「あ」の前と「そ」の後に \n がないこと。

単独の ” の扱い

ひとつの " を終わりの記号と見なさないので、自由に " を含めることが出来る。

let quotation = """
The White Rabbit put on his spectacles. "Where shall I begin,
please your Majesty?" he asked.
"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

3つの “ の扱い

" を3つ連続したいときは、\を用いて、裸の " が3つ並ぶのを回避する。

let threeDoubleQuotationMarks = """
はじめのひとつをエスケープ\"""
3つ全部をエスケープ\"\"\"
"""

生成したものの中身は

はじめのひとつをエスケープ"""\n3つ全部をエスケープ"""

改行コードを入れない

特定の行に改行コードを入れないことが出来る。\を用いる。

let sampleString = """
あいうえお
かきくけこ\
さしすせそ
"""

これは次と同等

"あいうえお\nかきくけこさしすせそ"

始めと終わりに改行コードを入れる

始めと終わりに改行コードをいれるには空の行を追加すればよい。

let sampleString = """あいうえお
かきくけこ
さしすせそ
"""

Mediumの仕様により空の行の追加がうまくいかないが、空の行を入れたとする。これは次と同等

"\nあいうえお\nかきくけこ\nさしすせそ\n"

インデント処理

行の左端から文字を書くのはコードが見にくくなるので次のように先頭にスペースを複数書いてもよい。

let sampleString = """
あいうえお
かきくけこ
さしすせそ
"""

これは

"あいうえお\nかきくけこ\nさしすせそ"

と同等。スペースの処理はこのように行われる

  1. 終わりの """ の前にあるスペースを数える。この場合4個。
  2. それぞれの行から4つ分の先頭スペースを排除

よって次のものは

let sampleString = """
あいうえお
かきくけこ
さしすせそ
"""

こうなる

"あいうえお\n    かきくけこ\nさしすせそ"
Appleの資料より

ちなみにスペースの代わりにタブでやってみたらタブでも大丈夫だった。

また、当然次のものも気になるが

let sampleString = """
あいうえお
かきくけこ
さしすせそ
"""

形式が正しくないのでコンパイルエラーになる。

結合

+ などを用いて結合する際はちょっとしたコツがいる。

let badStart = """
one
two
"""
let end = """
three
"""
print(badStart + end)

とすると、結果は

one
twothree

となり、意図した結果ではないだろう。次に

let goodStart = """
one
two
"""
print(goodStart + end)

のように空白行を一行空けると(Mediumの仕様により…入れたとする)結果は

one
two
three

となる。

おまけ

ローカライズすると、文章は localizable.strings に入れることが多いので、恩恵を受ける機会は少し限定される。

--

--

samekard
Swift・iOSコラム

iOSアプリをいろいろ作りました。英語と中国語を勉強中。