# 機能設計書 48-検索設定

## 概要

本ドキュメントは、Wikipedia iOSアプリにおける検索設定機能の設計を記載する。検索動作に関する設定（言語バー表示、アプリ起動時のタブ）を管理する機能である。

### 本機能の処理概要

検索設定機能は、SearchSettingsViewControllerを通じて、検索に関連する2つの設定項目を提供する。

**業務上の目的・背景**：ユーザーの検索体験をカスタマイズできるようにするため、検索画面での言語バー表示有無と、アプリ起動時に開くタブを設定できる機能を提供する。多言語ユーザーや検索を頻繁に使用するユーザーの利便性を向上させる。

**機能の利用シーン**：設定画面から「Search」をタップして遷移。多言語ユーザーが言語バーを常時表示したい場合や、検索を主目的とするユーザーがアプリを検索タブで開きたい場合に使用される。

**主要な処理内容**：
1. 言語バー表示設定（Show languages on search）
2. アプリ起動タブ設定（Open app on Search tab）

**関連システム・外部連携**：UserDefaultsで設定値を保存。設定値はSearchViewController、AppDelegateで参照される。

**権限による制御**：特別な権限は不要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 41 | SearchSettings画面 | 主画面 | 検索関連の設定 |

## 機能種別

設定管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| showSearchLanguageBar | Bool | No | 検索画面での言語バー表示 | - |
| openAppOnSearchTab | Bool | No | アプリ起動時に検索タブで開く | - |

### 入力データソース

- スイッチ操作（UISwitch）
- UserDefaults（保存済み設定値）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| wmf_showSearchLanguageBar | Bool | 言語バー表示設定 |
| wmf_openAppOnSearchTab | Bool | アプリ起動タブ設定 |

### 出力先

- UserDefaults（設定値の永続化）

## 処理フロー

### 処理シーケンス

```
1. viewDidLoad()
   ├─ テーブルビューセル登録
   └─ reloadSectionData() でセクションデータ構成
2. reloadSectionData()
   ├─ Item作成: showLanguagesOnSearch（controlTag: 1）
   ├─ Item作成: openAppOnSearchTab（controlTag: 2）
   └─ Section作成（フッターテキスト付き）
3. tableView(_:cellForRowAt:)
   └─ WMFSettingsTableViewCellにスイッチ設定
4. スイッチ操作（settingsTableViewCell(_:didToggleDisclosureSwitch:)）
   ├─ controlTag: 1 → wmf_setShowSearchLanguageBar()
   └─ controlTag: 2 → wmf_openAppOnSearchTab設定
5. reloadSectionData()で状態更新
```

### フローチャート

```mermaid
flowchart TD
    A[viewDidLoad] --> B[テーブルビューセル登録]
    B --> C[reloadSectionData]
    C --> D[セクションデータ構成]
    D --> E[テーブルビュー表示]
    E --> F{ユーザー操作}
    F -->|言語バースイッチ| G[wmf_setShowSearchLanguageBar]
    F -->|検索タブスイッチ| H[wmf_openAppOnSearchTab設定]
    G --> I[reloadSectionData]
    H --> I
    I --> E
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-48-01 | controlTagによる識別 | controlTag=1は言語バー、controlTag=2は起動タブ設定 | スイッチ操作時 |
| BR-48-02 | フッターテキスト | アプリ起動タブ設定の説明を表示 | 常時 |
| BR-48-03 | WMFSettingsTableViewCellDelegate | スイッチ操作のデリゲートパターン | スイッチ操作時 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 言語バー設定 | UserDefaults | UPDATE | wmf_showSearchLanguageBar の保存 |
| 起動タブ設定 | UserDefaults | UPDATE | wmf_openAppOnSearchTab の保存 |

### テーブル別操作詳細

#### UserDefaults

| 操作 | 項目（キー名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | wmf_showSearchLanguageBar | true/false | スイッチ操作時 |
| UPDATE | wmf_openAppOnSearchTab | true/false | スイッチ操作時 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | - | 特別なエラー処理なし |

### リトライ仕様

該当なし

## トランザクション仕様

該当なし

## パフォーマンス要件

- 設定変更は即座にUserDefaultsに保存
- 画面表示は軽量

## セキュリティ考慮事項

- 設定値はUserDefaultsに保存（機密情報は含まない）

## 備考

- SearchSettingsViewController: SubSettingsViewControllerを継承
- WMFNavigationBarConfiguring: ナビゲーションバー設定プロトコル
- Item構造体: title、isOn、controlTagを持つシンプルなデータモデル

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | Section、Item構造体 |

**読解のコツ**:
- **4-7行目**: Section構造体（items、footerTitle）
- **9-13行目**: Item構造体（title、isOn、controlTag）

#### Step 2: メイン処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | viewDidLoad、reloadSectionData |

**主要処理フロー**:
- **19-26行目**: viewDidLoad() - テーブルビュー設定とreloadSectionData()呼び出し
- **40-46行目**: reloadSectionData() - 2つの設定項目の構成

#### Step 3: スイッチ操作ハンドリングを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | WMFSettingsTableViewCellDelegate実装 |

**主要処理フロー**:
- **116-129行目**: settingsTableViewCell(_:didToggleDisclosureSwitch:)
- **118-123行目**: controlTagに基づくswitch文での処理分岐

### プログラム呼び出し階層図

```
SearchSettingsViewController
    │
    ├─ viewDidLoad()
    │      │
    │      ├─ tableView.register()
    │      │
    │      └─ reloadSectionData()
    │             │
    │             ├─ Item(showLanguagesOnSearch, isOn, controlTag: 1)
    │             ├─ Item(openAppOnSearchTab, isOn, controlTag: 2)
    │             └─ Section(items, footerTitle)
    │
    ├─ tableView(_:cellForRowAt:)
    │      └─ WMFSettingsTableViewCell設定
    │
    └─ settingsTableViewCell(_:didToggleDisclosureSwitch:)
           │
           ├─ controlTag == 1
           │      └─ UserDefaults.wmf_setShowSearchLanguageBar()
           │
           ├─ controlTag == 2
           │      └─ UserDefaults.wmf_openAppOnSearchTab = value
           │
           └─ reloadSectionData()
```

### データフロー図

```
[入力]                        [処理]                              [出力]

UserDefaults           ───▶ reloadSectionData()
(現在の設定値)               │
                            ▼
                     Item構成（isOn:現在値）
                            │
                            ▼
                     テーブルビュー表示
                            │
スイッチ操作          ───▶ didToggleDisclosureSwitch()
                            │
                            ▼
                     UserDefaults保存 ───────────▶ 設定値永続化
                            │
                            ▼
                     reloadSectionData() ────────▶ UI更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SearchSettingsViewController.swift | `Wikipedia/Code/SearchSettingsViewController.swift` | ソース | 検索設定画面のViewController |
| SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | ソース | 設定画面の基底クラス |
| WMFSettingsTableViewCell.swift | `Wikipedia/Code/WMFSettingsTableViewCell.swift` | ソース | 設定項目のテーブルセル |
| UserDefaults+WMF.swift | - | ソース | UserDefaults拡張（wmf_showSearchLanguageBar等） |
