Swift: Swiftの文字列と文字:String型の完全ガイド
文字列は日常の開発で最も頻繁に使用されるデータ型です。このレッスンでは、SwiftにおけるStringとCharacter���操作を完全に理解します。
1. 学習目標
- Stringの作成、連結、比較
- 文字列補間の構文とフォーマット出力
- 複数行文字列のインデントルール
- Character型と文字列の反復処理
- よく使う文字列メソッド:count、hasPrefix、uppercased など
2. 実話:カスタマーオペレーション担当者のケース
(1) 課題:手動のメールテンプレート連結が遅くてエラーが多発
CharlieはSaaS企業のカスタマーオペレーション担当者で、毎週2,000人以上の顧客にパーソナライズされたメールを送信しています。彼は最初、プラス記号で文字列を連結していました:
let firstName = "Alice"
let lastName = "Johnson"
let product = "Premium Plan"
let price = "299.00"
let email = "Dear " + firstName + " " + lastName + ",\n\nThank you for purchasing " + product + "!\nYour payment: $" + price + ".\n\nBest regards,\nCharlie"
コードは長く、保守が困難でした。テンプレートの形式を少し変更するだけでも全体を書き直す必要がありました。先週、彼は誤って「Dear AliceJohnson」(スペースなし)を300人以上の顧客に送信してしまいました。
(2) 解決策:文字列補間
CharlieはSwiftの文字列補間構文に切り替え、テンプレートがクリーンで読みやすくなりました:
let firstName = "Alice"
let lastName = "Johnson"
let product = "Premium Plan"
let price = "299.00"
let email = """
Dear \(firstName) \(lastName),
Thank you for purchasing \(product)!
Your payment: $\(price).
Best regards,
Charlie
"""
print(email)
出力:
TEXT 📖 参照専用拝啓 Alice Johnson 様 プレミアムプラン をご購入いただきありがとうございます! お支払い金額: $299.00 敬具 Charlie
(3) 結果:テンプレートコードの保守性が向上
| 観点 | Before(連結) | After(補間) |
|---|---|---|
| メールあたりのコード | 連結とエスケープで8行 | 補間で4行 |
| テンプレート編集時間 | 5〜10分 | 30秒 |
| エラー率 | 月3〜5件 | 0 |
| 可読性 | 記号が混在し校正が極めて困難 | ほぼプレーンテキスト |
3. 文字列の作成と連結
SwiftのString型は強力で、文字列を作成・操作するための複数の方法を提供します。
(1) 文字列リテラル
テキストをダブルクォートで囲んで文字列を作成します。Swiftは絵文字を含むUnicodeをサポートしています:
let greeting = "Hello, Swift!"
let empty = "" // Empty string
let emoji = "🚀" // Unicode support
| 作成方法 | 構文 | 説明 |
|---|---|---|
| リテラル | let s = "Hello" |
最も一般的 |
| 空文字列 | let s = "" |
空の文字列 |
| イニシャライザ | String() |
空文字列を生成 |
| 繰り返し | String(repeating: "!", count: 3) |
"!!!" |
graph LR
A[文字列の作成] --> B["リテラル: \"Hello\""]
A --> C["イニシャライザ: String()"]
A --> D["繰り返し: repeating count"]
A --> E["連結: +"]
A --> F["補間: \\(value)"]
(2) 文字列の連結
+または+=を使って文字列を連結するか、appendメソッドを使用します:
let firstName = "Alice"
let lastName = "Johnson"
// Using + for concatenation
let fullName = firstName + " " + lastName
print(fullName) // Alice Johnson
// Using += to append
var message = "Hello"
message += ", "
message += firstName
print(message) // Hello, Alice
// Using the append method
var greeting2 = "Welcome"
greeting2.append("!")
print(greeting2) // Welcome!
▶ サンプル: メールアドレス生成
// ============================================
// Generate email addresses from user info
// Demonstrates string creation and concatenation
// ============================================
let domain = "@example.com"
let alice = "alice.johnson"
let bob = "bob.smith"
let charlie = "charlie.brown"
let email1 = alice + domain
let email2 = bob + domain
let email3 = charlie + domain
print(email1)
print(email2)
print(email3)
// Build a full URL
let scheme = "https://"
let site = "api."
let fullURL = scheme + site + domain
print("API URL: \(fullURL)")
出力:
TEXT 📖 参照専用alice.johnson@example.com bob.smith@example.com charlie.brown@example.com API URL: https://api.example.com
4. 文字列補間とよく使うメソッド
文字列補間はSwiftの最も強力な文字列機能の一つで、変数、式、そして関数呼び出しさえも直接文字列に埋め込むことができます。
(1) 文字列補間
\(式)構文を使用して任意の値を文字列に埋め込みます:
let name = "Alice"
let age = 28
let height = 1.75
let intro = "My name is \(name), I am \(age) years old and \(height) meters tall."
print(intro)
// My name is Alice, I am 28 years old and 1.75 meters tall.
// Expressions inside interpolation
let price = 29.99
let qty = 3
let summary = "Total: $\(price * Double(qty))"
print(summary)
// Total: $89.97
| 補間の内容 | 構文 | 結果 |
|---|---|---|
| 変数 | \(name) |
変数の値 |
| 式 | \(price * 0.9) |
計算結果 |
| メソッド呼び出し | \(name.uppercased()) |
メソッドの戻り値 |
| 複数の値 | \(a) + \(b) = \(a + b) |
一つずつ埋め込み |
(2) よく使う文字列メソッド
SwiftのStringは豊富な組み込みメソッドを提供します:
let text = "Hello, Swift!"
text.count // 13 (character count)
text.isEmpty // false
text.hasPrefix("Hello") // true
text.hasSuffix("Swift!") // true
text.uppercased() // "HELLO, SWIFT!"
text.lowercased() // "hello, swift!"
text.contains("Swift") // true
| メソッド | 機能 | 例 | 結果 |
|---|---|---|---|
count |
文字数 | "Hello".count |
5 |
isEmpty |
空かどうか | "".isEmpty |
true |
hasPrefix |
接頭辞で始まるか | "Swift".hasPrefix("Sw") |
true |
hasSuffix |
接尾辞で終わるか | "Swift".hasSuffix("ft") |
true |
uppercased |
大文字に変換 | "Swift".uppercased() |
"SWIFT" |
lowercased |
小文字に変換 | "Swift".lowercased() |
"swift" |
contains |
部分文字列を含むか | "Hello".contains("ell") |
true |
▶ サンプル: ユーザー情報カード
// ============================================
// Generate a formatted user info card
// Demonstrates string interpolation and common methods
// ============================================
let firstName = "Alice"
let lastName = "Johnson"
let email = "alice.johnson@example.com"
let role = "Admin"
// Use interpolation to combine info
let displayName = "\(firstName) \(lastName)"
let emailDomain = email.contains("@") ? email.split(separator: "@")[1] : "unknown"
// Validate format
let isValidEmail = email.contains(".") && email.contains("@")
let isAdmin = role.uppercased() == "ADMIN"
print("=== User Card ===")
print("Name: \(displayName)")
print("Email: \(email)")
print("Domain: \(emailDomain)")
print("Valid Email: \(isValidEmail)")
print("Admin: \(isAdmin)")
print("Name Length: \(displayName.count) chars")
出力:
TEXT 📖 参照専用=== User Card === Name: Alice Johnson Email: alice.johnson@example.com Domain: example.com Valid Email: true Admin: true Name Length: 13 chars
5. 複数行文字列とCharacter
Swiftはトリプルクォート構文で複数行文字列を提供し、Character型は1つの文字を表します。
(1) 複数行文字列
3つのダブルクォート"""で内容を囲み、改行とインデントを保持します:
let poem = """
Roses are red,
Violets are blue,
Swift is awesome,
And so are you!
"""
print(poem)
出力:
TEXT 📖 参照専用Roses are red, Violets are blue, Swift is awesome, And so are you!
複数行文字列のインデントルール:閉じる"""の位置が各行から取り除かれる先頭の空白の量を決定します��
let indented = """
Line 1
Line 2
"""
// The 4 leading spaces on each line are stripped
| 特徴 | 1行文字列 | 複数行文字列 |
|---|---|---|
| 構文 | "..." |
"""...""" |
| 改行 | \nと書く必要あり |
直接改行可能 |
| クォート | \"でエスケープ必須 |
"を直接記述可能 |
| インデント | なし | 閉じ区切り文字の位置に基づく |
(2) Character型
Characterは1つの表示可能な文字(Unicodeスカラー)を表します。文字列は複数のCharacterで構成されます:
let ch: Character = "A"
let emoji: Character = "🌟"
// Iterate over each character in a string
let greeting = "Hi!"
for char in greeting {
print(char)
}
// Output: H i !
▶ サンプル: テキスト整形
// ============================================
// Generate a formatted product description
// Demonstrates multiline strings and Character iteration
// ============================================
let productName = "Swift Pro"
let version = "2.0"
let features = ["Fast", "Safe", "Modern", "Open Source"]
// Use a multiline string to build the product description
let description = """
Product: \(productName)
Version: \(version)
Features:
- \(features[0])
- \(features[1])
- \(features[2])
- \(features[3])
"""
print(description)
// Iterate over each character in the product name
print("Product name characters:")
for ch in productName {
print("[\(ch)]", terminator: " ")
}
print()
出力:
TEXT 📖 参照専用Product: Swift Pro Version: 2.0 Features: - Fast - Safe - Modern - Open Source Product name characters: [S] [w] [i] [f] [t] [ ] [P] [r] [o]
6. 完全な例:顧客メール生成
// ============================================
// Customer email generator
// Demonstrates concatenation, interpolation, multiline, and methods
// ============================================
import Foundation
// 1. Customer data
let customerName = "Charlie Brown"
let projectName = "DataSync Pro"
let dueDate = "2026-08-15"
let amount = 2499.00
// 2. Email subject
let subject = "Invoice for \(projectName) - Due \(dueDate)"
print("Subject: \(subject)")
print(String(repeating: "=", count: subject.count + 10))
// 3. Email body (multiline string + interpolation)
let body = """
Dear \(customerName),
Thank you for choosing \(projectName).
Invoice Summary:
- Project: \(projectName)
- Amount: $\(String(format: "%.2f", amount))
- Due Date: \(dueDate)
Please make the payment by \(dueDate).
If you have any questions, feel free to reply.
Best regards,
Swift Tech Team
"""
print(body)
// 4. Email validation
let isValidSubject = subject.hasPrefix("Invoice")
let containsProjectName = body.contains(projectName)
let isFormatted = body.hasSuffix("Team\n")
print("=== Validation ===")
print("Valid Subject: \(isValidSubject)")
print("Contains Project: \(containsProjectName)")
print("Proper Formatting: \(isFormatted)")
print("Body Length: \(body.count) chars")
出力:
TEXT 📖 参照専用件名: DataSync Pro の請求書 - 期限 2026-08-15 ============================================== 拝啓 Charlie Brown 様 DataSync Pro をお選びいただきありがとうございます。 請求概要: - プロジェクト: DataSync Pro - 金額: $2499.00 - 支払期限: 2026-08-15 2026-08-15 までにお支払いください。 ご質問がございましたら、お気軽にご返信ください。 敬具 Swiftテックチーム === 検証 === 有効な件名: true プロジェクト名を含む: true 適切な形式: true 本文の長さ: 278 文字
❓ よくある質問
"""が基準線となります。閉じ区切り文字の前の空白文字数が、各内容行の先頭から取り除かれます。区切り文字よりもインデントが少ない行は、その行から空白が取り除かれません。📖 まとめ
- 文字列はダブルクォートで作成。空文字列は
""またはString()を使用 +で文字列を連結し、+=で内容を追加- 文字列補間
\(式)で任意の値を文字列に埋め込み - よく使うメソッド:count、isEmpty、hasPrefix、hasSuffix、uppercased、contains
- 複数行文字列は
"""を使用。インデントは閉じ区切り文字の位置で決定 - Characterは1つの文字を表す。Stringを反復処理して各Characterを取得
📝 練習問題
- 初級: 文字列補間を使って「私の名前はX、Y歳です。」という文を生成してください。名前と年齢を変数に保存します。
- 中級: ユーザーが入力したメールアドレスを検証するプログラムを作成してください。要件:
@と.を含む、長さが5以上、小文字で出力。 - 上級: 複数行文字列を使って、ヘッダー、本文、フッターを持つHTMLメールテンプレートを生成し、ユーザー名、商品名、価格を補間で埋め込んでください。