# String型

String型とは、文字列を表す型です。

Swiftは、ダブルクォート で囲まれた値を文字列リテラルとして解釈し、String型の値と判断します。

let a: String = "Hello"

型推論が効くので明示的に型を指定しなくても、ダブルクォートで囲まれた値はString型として解釈してくれます。

let a = "Hello"

# エスケープシーケンス

文字列を生成するのに、ダブルクォートを使用しました。しかし、ダブルクォート自体を文字列として扱いたい場合はそのまま使用することはできません。

このような特殊文字を表すために、 \ (バックスラッシュ) を使用することができます。

\ を特殊文字の手前につけることで、Swiftは文字列として判断してくれます。

let a = " \"Hello\" " // "Hello"

改行は、\n を使うことができます。

let a = "Hello\nTom"

// Hello
// Tom

その他にも、シングルクォテーションやバックスラッシュ自身にも \ を使う必要があります。

let a = "I\'m a Taro \"  // I'm a Taro \

# 文字列の結合

文字列を結合する場合は、+ 演算子を使うことができます。

次の例では、Hello,Tom の文字列を結合させています。また、変数 a に対しても + 演算子で文字列を続けて結合させています。

let a = "Hello, " + "Tom" // Hello, Tom
let b = a + " and Mike"   // Hello, Tom and Mike

+= 演算子を使うと、既存の値に文字列を追加することができます。

var a = "Hello, " // Hello,
a += "Tom" // Hello, Tom

また、append メソッドは + 演算子と同じように使用できます。

var a = "Hello, " // Hello,
a.append("Tom")   // Hello, Tom

# 文字列と変数

文字列の中で変数を使用する場合は、\() を使うことができます。

let name = "Tom"

let a = "Hello, \(name)" // Hello, Tom

\() の中では、String型ではない値も展開することができます。

let age = 20

let a = "I'm \(age)" // I'm 20

# 複数行の文字列

複数行の文字列を表現するには、""" (ダブルクォート3つ)を使うことができます。

let a = """
おはようございます。
こんにちは。
こんばんわ。
"""

複数行を書くときは、次の点に注意してください。

# """ と同じ行に文字を書くことはできない

Swiftで複数行を書くときは、始まりの """ と同じ行に文字を書くことはできません。

次の例では、おはようございます。 の文字列が始まりの """ と同じ行に位置しているためエラーになります。

// """ と同じ行になっている
let a = """おはようございます。 
こんにちは。
こんばんわ。

"""

// error: multi-line string literal content must begin on a new line
// let a = """おはようございます。

# 終了の """ より中の文字のインデントを下げて書くことはできない

また、終了の """ より文字のインデントを下げることができません。

次の例では、終了の """ が文字列のインデントより低いためエラーになります。

// 終了の `"""` より中身のインデントが低い
let a = """
おはようございます。
こんにちは。
こんばんわ。
  """

// error: insufficient indentation of next 3 lines in multi-line string literal
// おはようございます。
// change indentation of these lines to match closing delimiter
// おはようございます。