Swift: Swiftの配列チュートリアル:作成、CRUD、走査メソッドの解説
配列は買い物リストのようなものです——すべてのTo-Do項目が順番に並んでいます。この��ッスンではSwiftの配列操作の完全なセットを、作成からCRUDまですべて一箇所で学びます。
1. 学習目���
- 複数の方法で配列を作成し、要素の型を指定
- append、insert、removeを使った要素の追加と削除
- 添字を使った配列要素のアクセスと変更
- for-inとenumeratedを使った配列の走査
- isEmpty、count、containsなどの実用的なプロパティの使用
2. EC開発者の実話
(1) 課題:ショッピングカートのリスト管理が混乱、データが同期しない
AliceはECアプリのショッピングカート機能を構築しています。ユーザーCharlieは5つの商品を追加し、2つを削除し、数量を3回変更しました。決済時に彼女が発見したのは:カートの合計が個別の商品価格と一致しない!
SWIFT
// Alice's original "manual" approach
var cartItem1 = "Laptop"
var cartItem2 = "Mouse"
var cartItemPrice1 = 999.0
var cartItemPrice2 = 25.0
// By the time items piled up, she was lost...
Aliceは6つの商品を12個の別々の変数で管理していました。7つ目の商品を追��した時、変数に何と名前を付ければいいかさえわかりませんでした。カートデータが20以上の変数に散らばり——一つ変更すると他を忘れる。
(2) 配列の解決策
SWIFT
var cartItems = ["Laptop", "Mouse", "Keyboard"]
var cartPrices = [999.0, 25.0, 89.0]
cartItems.append("Monitor")
cartPrices.append(349.0)
cartItems.remove(at: 1)
cartPrices.remove(at: 1)
print("Cart: \(cartItems)")
print("Total: $\(cartPrices.reduce(0, +))")
(3) 結果:構造化されたデータ、バグ90%削減
| 指標 | 散在した変数 | 配列管理 |
|---|---|---|
| 変数の数 | 18 | 2 |
| 商品追加 | 3つの新しい変数を作成 | 1行のappend |
| データの一貫性 | しばしば同期しない | 同期が保証される |
| 週あたりのバグ | 3-5 | 0-1 |
3. 配列の作成と基本プロパティ
配列は要素の順序付きコレクションです——すべての要素は同じ型でなければなりません。
graph TB
A[配列] --> B[インデックス 0]
A --> C[インデックス 1]
A --> D[インデックス 2]
A --> E[インデックス ...]
B --> F[要素]
C --> F
D --> F
E --> F
| 作成方法 | 例 | 備考 |
|---|---|---|
| リテラル | [1, 2, 3] | 最も一般的 |
| 型アノテーション | Int | 空の配列 |
| 繰り返し値 | Array(repeating: 0, count: 5) | すべてゼロ |
| 範囲から | Array(1...5) | 範囲から作成 |
(1) 配列の作成
SWIFT
// Method 1: literal
let numbers = [1, 2, 3, 4, 5]
// Method 2: empty array
var emptyArray: [String] = []
// Method 3: repeated value
let zeros = Array(repeating: 0, count: 3)
print(zeros)
// Method 4: from range
let rangeArray = Array(10...15)
print(rangeArray)
(2) よく使うプロパティ
SWIFT
let items = ["Apple", "Banana", "Orange"]
print("Count: \(items.count)")
print("Is empty: \(items.isEmpty)")
print("First: \(items.first ?? "None")")
print("Last: \(items.last ?? "None")")
print("Contains Apple: \(items.contains("Apple"))")
▶ サンプル: 倉庫在庫チェック
SWIFT
// ============================================
// Managing warehouse inventory with arrays
// ============================================
var inventory: [String] = []
if inventory.isEmpty {
print("Warehouse is empty, adding stock...")
}
inventory.append("Laptop")
inventory.append("Mouse")
inventory.append("Keyboard")
inventory.append("Monitor")
print("Inventory has \(inventory.count) items")
print("Products: \(inventory.joined(separator: ", "))")
print("First item: \(inventory[0])")
print("Last item: \(inventory[inventory.count - 1])")
出力:
TEXT 📖 参照専用Warehouse is empty, adding stock... Inventory has 4 items Products: Laptop, Mouse, Keyboard, Monitor First item: Laptop Last item: Monitor
4. 配列のCRUD操作
配列は可変コレクションです——任意の位置に要素を追加および削除できます。
| 操作 | メソッド | 例 |
|---|---|---|
| 末尾に追加 | append(_:) |
array.append(4) |
| 位置に挿入 | insert(_:at:) |
array.insert(0, at: 0) |
| 位置の削除 | remove(at:) |
array.remove(at: 2) |
| 最後を削除 | removeLast() |
array.removeLast() |
| すべて削除 | removeAll() |
array.removeAll() |
| 要素を変更 | 添字代入 | array[1] = 100 |
(1) 要素の追加と挿入
SWIFT
var tasks = ["Buy groceries", "Pay bills"]
// Append to end
tasks.append("Call doctor")
// Insert at specific position
tasks.insert("Check email", at: 0)
print(tasks)
(2) 要素の削除と変更
SWIFT
var scores = [88, 92, 75, 60, 95]
// Modify
scores[1] = 98
// Remove
let removed = scores.remove(at: 3)
print("Removed: \(removed)")
scores.removeLast()
scores.sort()
print(scores)
▶ サンプル: ToDoリスト管理
SWIFT
// ============================================
// Simple to-do list with arrays
// ============================================
var todoList = ["Buy milk", "Walk dog", "Write report"]
// Add
todoList.append("Read book")
todoList.insert("Morning exercise", at: 0)
// Modify
todoList[2] = "Write weekly report"
// Remove
let completed = todoList.remove(at: 1)
print("Completed: \(completed)")
// Traverse
print("\n=== Today's Todo ===")
for (i, task) in todoList.enumerated() {
print("\(i + 1). \(task)")
}
print("\nRemaining tasks: \(todoList.count)")
出力:
TEXT 📖 参照専用完了: 犬の散歩 === 今日のToDo === 1. 朝の運動 2. 牛乳を買う 3. 週次レポート作成 4. 本を読む 残りタスク: 4
5. 配列の走査と一括操作
Swiftは配列を走査する複数の方法と実用的な一括操作メソッドを提供します。
| 走査方法 | 構文 | ユースケース |
|---|---|---|
| 基本 | for item in array |
要素のみ気にする場合 |
| インデックス付き | for (i, item) in array.enumerated() |
インデックス番号が必要な場合 |
| フィルタ付き | for item in array where 条件 |
一致する要素のみ |
| 高階関数 | array.map { } |
各要素を変換 |
| フィルタ | array.filter { } |
一致する要素を保持 |
(1) 基本走査とフィルタ付き走査
SWIFT
let numbers = [3, 7, 2, 8, 5, 1, 9, 4, 6]
// Basic for-in
for num in numbers {
print(num, terminator: " ")
}
print()
// where filter
for num in numbers where num > 5 {
print("\(num) is greater than 5")
}
(2) 高階関数: mapとfilter
SWIFT
let prices = [12.99, 24.50, 8.75, 35.00]
// map: add tax to each price
let withTax = prices.map { $0 * 1.08 }
print("With tax: \(withTax)")
// filter: items over 20
let expensive = prices.filter { $0 > 20 }
print("Expensive: \(expensive)")
▶ サンプル: 注文データ分析
SWIFT
// ============================================
// Analyzing order data with array operations
// ============================================
let orderAmounts = [45.0, 120.0, 33.5, 299.0, 55.0, 180.0, 22.0]
// 1. Total sales
let total = orderAmounts.reduce(0, +)
print("Total sales: $\(total)")
// 2. High-value orders (>= 100)
let highValue = orderAmounts.filter { $0 >= 100 }
print("High-value orders: \(highValue.count)")
// 3. Add 10% service fee to all orders
let withServiceFee = orderAmounts.map { $0 * 1.1 }
print("First 3 with fee: \(Array(withServiceFee.prefix(3)))")
// 4. Sort
let sorted = orderAmounts.sorted(by: >)
print("Top 3: \(Array(sorted.prefix(3)))")
出力:
TEXT 📖 参照専用Total sales: $754.5 High-value orders: 3 First 3 with fee: [49.5, 132.0, 36.85] Top 3: [299.0, 180.0, 120.0]
6. 完全な例:ショッピングカート管��システム
SWIFT
// ============================================
// Shopping cart management system
// Combining array CRUD, traversal, and higher-order functions
// ============================================
import Foundation
var cartItems: [String] = []
var cartPrices: [Double] = []
func addItem(name: String, price: Double) {
cartItems.append(name)
cartPrices.append(price)
print("Added: \(name) - $\(price)")
}
func removeItem(at index: Int) {
guard index >= 0 && index < cartItems.count else {
print("Invalid index")
return
}
let removed = cartItems.remove(at: index)
cartPrices.remove(at: index)
print("Removed: \(removed)")
}
func updateQuantity(name: String, newPrice: Double) {
if let index = cartItems.firstIndex(of: name) {
cartPrices[index] = newPrice
print("Updated: \(name) -> $\(newPrice)")
}
}
func checkout() {
guard !cartItems.isEmpty else {
print("Cart is empty")
return
}
print("\n=== Shopping Cart ===")
var total = 0.0
for (i, item) in cartItems.enumerated() {
let price = cartPrices[i]
total += price
print("\(i + 1). \(item) - $\(String(format: "%.2f", price))")
}
let tax = total * 0.08
let grandTotal = total + tax
print("---")
print("Subtotal: $\(String(format: "%.2f", total))")
print("Tax (8%): $\(String(format: "%.2f", tax))")
print("Total: $\(String(format: "%.2f", grandTotal))")
let expensiveItems = cartPrices.enumerated().filter { $0.element > 100 }
if !expensiveItems.isEmpty {
print("\nHigh-value items:")
for (i, _) in expensiveItems {
print(" - \(cartItems[i])")
}
}
}
addItem(name: "Laptop", price: 999.0)
addItem(name: "Mouse", price: 25.0)
addItem(name: "Keyboard", price: 89.0)
addItem(name: "Monitor", price: 349.0)
addItem(name: "USB Hub", price: 35.0)
removeItem(at: 4)
updateQuantity(name: "Mouse", newPrice: 22.5)
checkout()
出力:
TEXT 📖 参照専用追加: ノートPC - $999.0 追加: マウス - $25.0 追加: キーボード - $89.0 追加: モニター - $349.0 追加: USBハブ - $35.0 削除: USBハブ 更新: マウス -> $22.5 === ショッピングカート === 1. ノートPC - $999.00 2. マウス - $22.50 3. キーボード - $89.00 4. モニター - $349.00 --- 小計: $1459.50 税 (8%): $116.76 合計: $1576.26 高額商品: - ノートPC - モニター
❓ よくある質問
Q 配列の範囲外アクセスはどうなりますか?
A プログラムがクラッシュします(実行時エラー)。添字アクセスの前に常にindex < array.countを確認するか、indices.contains(index)でチェックしてください。
Q appendとinsertのパフォーマンス��違いは?
A appendはO(1)(末尾に追加)。insertはO(n)(後続の要素をシフトする必要がある)。先頭への頻繁な挿入には他のデータ構造(例:連結リスト)を検討してください。
Q 配列は値型ですか、参照型ですか?
A 配列は値型(struct)です。新しい変数に代入するとコピーが作成され、コピーを変更しても元の配列に影響しません。
Q 2つの配列を結合するには?
A +演算子を使用します:
let combined = array1 + array2。またはappend(contentsOf:)を使って別の配列のすべての要素を追加します。Q removeAllはメモリを解放しますか?
A
removeAll()は要素をクリアしますが容量は保持します。メモリも解放するにはremoveAll(keepingCapacity: false)を使用します。📖 まとめ
- 配列は
[型]で表され、リテラル、繰り返し値、範囲から作成可能 - よく使う操作:append、insert、remove、添字変更
- 配列は値型——代入はコピーを作成
- 走査方法には基本のfor-in、インデックス付きenumerated、whereフィルタリングがある
- reduce、map、filterで一括操作をより簡潔で関数的に
- 配列要素にアクセスする前に常にインデックス境界をチェックしてクラッシュを防止
📝 練習問題
- 初級: 5つの都市名の配列を作成してください。for-inを使って「[都市名]が大好きです」と各行に表示してください。
- 中級: 学生の成績管理システムを作成:成績配列[78, 92, 55, 88, 73]を初期化し、新しい成績の追加、不合格(<60)の削除、平均の計算、最高点の検出を実装してください。
- 上級: 簡単な「カートおすすめ」機能を実装してください。カート配列["ノートPC", "マウス", "キーボード"]とおすすめルール表(ノートPC → ノートPCバッグ、マウス → マウスパッド、キーボード → リストレスト)を与えられたら、おすすめ商品を自動生成してカートに追加してください。既存の商品は追加しないでください。