Swift: Swiftの配列チュートリアル:作成、CRUD、走査メソッドの解説

配列は買い物リストのようなものです——すべてのTo-Do項目が順番に並んでいます。この��ッスンではSwiftの配列操作の完全なセットを、作成からCRUDまですべて一箇所で学びます。

1. 学習目���


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. 配列の作成と基本プロパティ

配列は要素の順序付きコレクションです——すべての要素は同じ型でなければなりません。

100%
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)を使用します。

📖 まとめ


📝 練習問題

  1. 初級: 5つの都市名の配列を作成してください。for-inを使って「[都市名]が大好きです」と各行に表示してください。
  2. 中級: 学生の成績管理システムを作成:成績配列[78, 92, 55, 88, 73]を初期化し、新しい成績の追加、不合格(<60)の削除、平均の計算、最高点の検出を実装してください。
  3. 上級: 簡単な「カートおすすめ」機能を実装してください。カート配列["ノートPC", "マウス", "キーボード"]とおすすめルール表(ノートPC → ノートPCバッグ、マウス → マウスパッド、キーボード → リストレスト)を与えられたら、おすすめ商品を自動生成してカートに追加してください。既存の商品は追加しないでください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%