Swift

【Swift入門 文法編】String型をマスターしよう

この記事ではSwiftの基本的な型である、String型について説明していきます。

プログラミングが初心者も、他の言語をやっていてSwiftは初心者という人にもわかるように説明していきたいと思います。

String型とは

String型は文字列を表します。
Swift以外の他の大体の言語でもString型は文字列を表します。

たまにNSString型というものを見かけるかもしれませんが、そちらはSwiftの前の言語のObjective-Cで使用されていたもので、SwiftではString型を使用します。

String型の書き方

"abc"のようにダブルクオーテーションで囲むことで文字列の値となります。


let a = "あいうえお" //String型

上の用にすることで、ダブルクオーテーションで囲むと、型推論でString型と推論されます。
型推論に関しては、こちらの記事で解説しています。

【swift入門 文法編 】変数・定数・型についてこの記事ではswiftの変数・定数について、型の基本的な内容について学習していきます。swiftを始める上で一番基本的な内容になります。プログラミングがはじめての人も、他の言語をやっていてswiftははじめての人にもわかるように説明していきたいと思います。 変数と定数とは、値を記憶するための入れ物です。 変数・定数ともに名前・型・値を持ちます。...

他の言語では文字列を'(シングルクオーテーション)でも囲うことも可能な場合もありますが、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型に関してはこちらの記事で説明しています。

【Swift入門】オプショナル型を理解しようswiftの大きな特徴といえばOptional型ですね。 ですが初心者にとっては、Optional型というと、 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

単純に最初の文字か最後の文字を取得したい場合は、firstlastを使うと簡単にできます。


let string1 = "abc"
string1.first // "a"
string1.last  // "c"

let string2 = ""
string2.first // nil
string2.last  // nil

もしstringが空文字だった場合には最初や最後の文字がないのでnilが返ってくることになるので、実行結果はOptionalとなっています。

Optional型に関してはこちらの記事で説明しています。

【Swift入門】オプショナル型を理解しようswiftの大きな特徴といえばOptional型ですね。 ですが初心者にとっては、Optional型というと、 Optionalって...

まとめ

今回はString型についてまとめていきました。
String型は基本的な型の中でもよく使う型であるので、しっかり基本を押さえておきましょう。

Swiftの入門記事に関してはこちらにまとめていますので参考にしてみてください。

〜初心者でもわかるswift入門〜基本文法からiOSアプリを開発するまでこのシリーズではプログラミング初心者の人や、swiftを初めて触れる人、やってみたもののよくわからないという人向けに、swiftの基本文法から実際に動くiOSアプリをXcodeで開発するところまでを解説します。...