この記事ではSwift
の基本的な型である、String型
について説明していきます。
プログラミングが初心者も、他の言語をやっていてSwift
は初心者という人にもわかるように説明していきたいと思います。
サンプルコードも交えながら説明していきますので、Playground
を使って実際に手を動かしながら行えると効率よく学習できるかなと思います。
String型とは
String型
は文字列を表します。
Swift
以外の他の大体の言語でもString型
は文字列を表します。
たまにNSString型
というものを見かけるかもしれませんが、そちらはSwift
の前の言語のObjective-C
で使用されていたもので、Swift
ではString型
を使用します。
String型の書き方
"abc"
のようにダブルクオーテーションで囲むことで文字列の値となります。
let a = "あいうえお" //String型
上の用にすることで、ダブルクオーテーションで囲むと、型推論でString型
と推論されます。
型推論に関しては、こちらの記事で解説しています。
他の言語では文字列を'
(シングルクオーテーション)でも囲うことも可能な場合もありますが、Swift
ではコンパイルエラーになり、以下のようにダブルクオーテーションを使うように促されます。
特殊文字の表現
文字列を表現する際に、"
で囲むというルール上、中身に"
が使えなかったり、1行で記述しないといけないので、改行がそのままでは使えません。
そのためSwift
では\
(バックスラッシュ)と組み合わせてこのような問題を解決するための特殊文字を表現します。このような表現をエスケープシーケンス
と呼びます。
/
はMacのキーボードでは「¥」のボタンで入力できます。
もしできない場合は、
https://qiita.com/miyohide/items/6cb8967282d4b2db0f61
こちらの記事のやり方で設定してみてください。
Swift
で用いることができるエスケープシーケンスの例です。
これらはよく使うので覚えておきましょう。
\n | 改行 |
---|---|
\” | ダブルクオーテーション |
\’ | シングルクオーテーション |
\\ | バックスラッシュ |
実際に使用してみるとこのようになります。
let sample1 = "1\n2\n3"
let sample2 = "文字列は\"で囲む"
let sample3 = "\'で囲むのは使えません。"
let sample4 = "\\は\\\\と記述します。"
print(sample1)
print(sample2)
print(sample3)
print(sample4)
//実行結果
1
2
3
文字列は"で囲む
'で囲むのは使えません。
\は\\と記述します。
文字列の結合
Swift
では+
と+=
演算子を用いることで文字列の結合を行います。
let a = "aaa"
let b = "bbb"
let c = a + b
print(c)
//実行結果
aaabbb
+=
演算子では、x += a
とした場合にx = x + a
と同様の意味になります。
再代入の形になるので変数でしか使用できません。
var a = "aaa"
a += "bbb"
print(a)
//実行結果
aaabbb
文字列の変数・定数の値の展開
\()
というエスケープシーケンスを用いることで、変数や定数の値を文字列内に展開することができます。このときの変数や定数の値はString型
ではないものも展開することができます。
例を見ていきましょう。
let culc = 1 + 2
let result = "計算結果: \(culc)"
print(result)
//実行結果
計算結果: 3
このように1+2
の計算結果である3
が実行結果で出力されていることがわかりました。
この記法はよく使うのでいつでも使えるようにしておきましょう。
"名前: \(定数)"
というような形式でprint
することは、デバッグ(バグの原因箇所を見つけて修正する作業)の際に、どの値の出力結果かをわかりやすくするためによく使います。
複数行の文字列の書き方
複数行にまたがる文字列を生成したい場合は、"""
で囲んで書くことができます。
let tanka = """
この世をば
わが世とぞ思ふ
望月の
欠けたることも
なしと思へば
"""
print(tanka)
//実行結果
この世をば
わが世とぞ思ふ
望月の
欠けたることも
なしと思へば
今回は細かくは触れませんが、この記法を用いる場合には、
- 開始と終了の
"""
と同じ行に中身の文字を書いてはいけない - 終了の
"""
より中身の文字のインデントを下げてはいけない
といった制限があるので注意です。
Int型との相互変換
String型
から別の型へ、あるいは別の型からString型
へ変換したい場合があるかと思います。
ここでは整数を表すInt型
を例として軽く説明していきます。
Int型
からString型
に変換する場合はString型
のイニシャライザ
を使います。
イニシャライザ
というのは初期化のためのメソッドで、クラス
や構造体
を説明する際に詳しく説明します。
let int = 100
let string = String(int) // "100"
String型
をInt型
に変換する場合には、Int型
のイニシャライザ
を使用します。
先程のInt型
からString型
は必ず成功するのに対して、String型
からInt型
の場合、文字列が数値の形式に必ずしもなっているとは限らないため、失敗する可能性があります。
なので変換した値はOptional<Int>
型になります。
let string1 = "10"
let int1 = Int(string1) //10
let string2 = "aaa"
let int2 = Int(string2) //nil
Optional型
に関してはこちらの記事で説明しています。
Character型について
String型
と関連があるCharacter型
に関して説明していきます。
Character型
はSwift
で開発する上でよく使うかというとそういうわけではありませんが、String型
を深く理解のために知っておくといいと思います。
String型
が"abc"
といった文字列を表すのに対して、Character型
は"a"
のような単一の文字を表します。
"
で囲むのはString型
と同様なので1文字であったとしても、型推論ではString型
となってしまうので、Character型
は型アノテーションを使って型を明示する必要があります。
let string = "a" //String型
let character: Character = "a" //Character型
Character型
は単一の文字を表すので、例えばString型
の"abc"
はCharacter型
の"a", "b", "c"
の集まりと言うことができます。
このようにデータの集まりをまとめて格納するデータ構造を「コレクション」といいます。
この記事では紹介しませんが、後々出てくる配列
や辞書
もコレクション
です。
コレクション
であることによって、要素数のカウントや要素の列挙、取り出しをすることができます。
String型
はCharacter型
の要素のコレクションであるので、文字数のカウント、1文字ずつ列挙する機能を持ち合わせています。
let string = "abc"
string.count //3
for character in string {
print(character)
}
//実行結果
a
b
c
for文
に関してはまた別の記事で説明していきます。
要素の取り出しは、サブスクリプト
という機能を使って行います。
サブスクリプト
はコレクション[インデックス]
のような形式で[]
でインデックスを囲い要素の取得や書き換えを行うことができます。
String型
のインデックスを表すのはString.Index型
になります。
この辺の内容は少し発展的な内容になるので、もしわからなかったらサブスクリプト
というワードだけ覚えて、スルーしてしまって大丈夫です。
以下がString型
から文字を取り出す例になります。
let string = "abc"
//最初のIndexを表すString.Index型
let startIndex = string.startIndex
//終了のIndexを表すString.Index型
//終了のIndexは最後の文字ではなくその次の文字ということに注意
let endIndex = string.endIndex
let start = string[string.startIndex] //a
//index(元になるインデックス, offsetBy: ずらす数)で2文字目を取得
let second = string[string.index(string.startIndex, offsetBy: 1)] //b
//endIndexは最後の次の文字なのでoffsetByで1つ戻すことが必要
let end = string[string.index(string.endIndex, offsetBy: -1)] //c
単純に最初の文字か最後の文字を取得したい場合は、first
やlast
を使うと簡単にできます。
let string1 = "abc"
string1.first // "a"
string1.last // "c"
let string2 = ""
string2.first // nil
string2.last // nil
もしstring
が空文字だった場合には最初や最後の文字がないのでnil
が返ってくることになるので、実行結果はOptional
となっています。
Optional型
に関してはこちらの記事で説明しています。
まとめ
今回はString型
についてまとめていきました。
String型
は基本的な型の中でもよく使う型であるので、しっかり基本を押さえておきましょう。
Swift
の入門記事に関してはこちらにまとめていますので参考にしてみてください。