文字列はテキストデータを表します。
Swiftでは、StringはCharacter値の順序付きコレクションで、各文字はUnicode文字を表します。
文字列は、文字列リテラルを使って作成します。文字列リテラルとは、二重引用符(")で囲まれた文字の並びです。
複数行の文字列には、二重引用符を3つ並べたもの(""")を使います。
let hello: String = "Hello, World!"
let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""
Swiftの文字列は、FoundationフレームワークのNSStringクラスとシームレスに連携し、豊富なテキスト処理機能を利用できます。
Characterは、1つの拡張書記素クラスタを表します。これは、1つ以上のUnicodeスカラー値からなる、人間が読める文字です。
Unicodeスカラー値は、U+0000からU+D7FFまで(両端を含む)、またはU+E000からU+10FFFFまでの範囲の21ビットのコードポイントです。
let aChar: Character = "A"
文字列リテラルを書くと、Swiftはその型を自動的にStringと推論します。
1文字をCharacterとして格納するには、型注釈を明示的に書く必要があります。
let aString = "A" // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar)) // Prints Character
// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'
文字列は、加算演算子(+)を使って連結できます。
print("honey" + "comb")
// Prints "honeycomb"
まず文字を文字列に変換しない限り、+を使ってCharacterをStringに直接連結することはできません。
ただし、append(_:)メソッドを使えば、文字列または文字を可変の文字列に直接追加できます。
var greeting = "Hello"
let world = ", world"
let period: Character = "."
greeting.append(world)
print(greeting) // Prints "Hello, world"
greeting.append(period)
print(greeting) // Prints "Hello, world."
文字列補間を使うと、定数、変数、リテラル、式を文字列リテラルの中に埋め込んで文字列を組み立てられます。
各式は、バックスラッシュを前に付けた括弧(\( ... ))で囲みます。
let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"
文字列と文字には、内容を調べるためのプロパティがいくつかあります。
よく使う文字列のプロパティには、次のようなものがあります。
| プロパティ | 説明 | 例 |
|---|---|---|
isEmpty |
文字列に文字が1つもない場合にtrueを返します |
"Hello".isEmptyはfalseと評価されます |
count |
文字列に含まれる文字の数を返します |
"Hello".countは5と評価されます |
プロパティの完全な一覧は、AppleのStringドキュメントを参照してください。
よく使う文字のプロパティには、次のようなものがあります。
| プロパティ | 説明 | 例 |
|---|---|---|
isLowercase |
文字が小文字の場合にtrueを返します |
"a".isLowercaseはtrueと評価されます |
isUppercase |
文字が大文字の場合にtrueを返します |
"A".isUppercaseはtrueと評価されます |
isNumber |
文字が数字の場合にtrueを返します |
"1".isNumberはtrueと評価されます |
isWhitespace |
文字が空白文字の場合にtrueを返します |
" ".isWhitespaceはtrueと評価されます |
プロパティの完全な一覧は、AppleのCharacterドキュメントを参照してください。
String(_:)イニシャライザを使うと、他の型を文字列に変換できます。IntやDouble、Characterなどの標準的な型に対応しています。
let charX: Character = "x"
print(String(charX)) // Prints "x"
print(String(110)) // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"
Swiftの文字列リテラルは、特殊文字を表すいくつかのエスケープシーケンスに対応しています。
| シーケンス | 説明 |
|---|---|
\0 |
ヌル文字 |
\\ |
バックスラッシュ |
\t |
水平タブ |
\n |
ラインフィード(改行) |
\r |
キャリッジリターン |
\' |
単一引用符 |
\" |
二重引用符 |
\u{n} |
任意のUnicodeスカラー(16進数) |
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.
let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖
この演習では、看板会社がオリジナルのメッセージ入り看板を作るのを手伝うコードを書きます。
看板を作るために使う、次の定数文字列を定義します。
birthday: 値は"Birthday"ですvalentine: 値は"Valentine's Day"ですanniversary: 文字列"Anniversary"を持ちます看板を作るために使う、次の定数文字を定義します。
space: 値は" "(半角のスペース1つ)ですexclamation: 値は"!"です関数buildSign(for:name:)を実装します。この関数は、引数forと引数nameを取ります。forには、最初のタスクで定義した3つの文字列のうちの1つが入ります。nameは文字列で、看板を贈る相手の名前が入ります。
連結を使って看板のメッセージを組み立てましょう。すでに定義した定数を再利用するのを忘れないでください。
関数は看板のメッセージを文字列として返します。
buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"
buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"
関数graduationFor(name:year:)を実装します。この関数は、引数nameと引数yearを取ります。nameは文字列で、看板を贈る相手の名前が入ります。yearは整数で、その人が卒業する年が入ります。
テンプレート文字列を使って看板のメッセージを組み立てましょう。
関数は看板のメッセージを文字列として返します。
graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"
関数costOf(sign:)を実装します。この関数は、引数signを取ります。signは文字列で、看板のメッセージが入ります。
看板の基本料金は、所定の通貨で20です。さらに、1文字ごとに2かかります(空白も計算に含まれます)。
関数は看板の費用を整数として返します。
costOf(sign: "Happy Birthday Grandma!")
// returns 66