Swift開発手法をポケモンで理解してみよう⑥

ポケモンニワカなのでポケモンに関する情報は正確ではない可能性があります、ご容赦ください。

Swift開発手法をポケモンに例えて覚えてみようとする試み。

Part6です。

Part6

do-catch

ピンチをチャンスに変えるラッキー

解説
  • タイプ: ノーマル (どんなタイプのエラーにも対応)
  • 特性: しあわせタマゴ (経験値を多く得るように、エラーから学びを得る)
  • 得意技:
    • タマゴうみ: エラーが発生しても、代替処理でプログラムを継続
    • いやしのすず: エラーによる影響を軽減
    • ちきゅうなげ: エラーを発生源から遠ざけ、安全な場所へ
  • 性格: やさしい (エラーに対して寛容に対応)

ラッキーのように、do-catchは:

  • プログラム実行中に発生するエラーをキャッチし、適切な処理を行います。
  • エラーが発生しても、プログラムをクラッシュさせずにリカバリーを試みることができます。
  • エラーの種類に応じて異なる処理を実行できます。
enum PokeError: Error {
    case networkError
    case dataError
}

do {
    // ポケモンの情報を取得する処理 (APIリクエストなど)
    let success = true // ここでは成功を想定

    if success {
        let pokemon = "ピカチュウ"
        print("\(pokemon)をゲット!")
    } else {
        throw PokeError.networkError // エラーを発生させる
    }
} catch PokeError.networkError {
    print("ネットワークエラーが発生しました。") // ネットワークエラー時の処理
} catch PokeError.dataError {
    print("データエラーが発生しました。") // データエラー時の処理
} catch {
    print("予期せぬエラーが発生しました: \(error)") // その他のエラー時の処理
}
  1. do ブロック内で、エラーが発生する可能性のある処理を実行します。
  2. エラーが発生した場合、throw 文でエラーを投げます。
  3. catch ブロックで、発生したエラーの種類に応じて処理を記述します。
  4. 複数の catch ブロックを用意することで、異なる種類のエラーに対して異なる処理を実行できます。
  5. 最後の catch ブロックは、全てのエラーをキャッチする汎用的なエラーハンドリングを行います。

if let と guard let

1. if let

好奇心旺盛なシェイミ (ランドフォルム)

解説
  • タイプ: くさ (Optionalな値を安全にアンラップし、新しい世界を探索)
  • 特性: しぜんかいふく (Optionalな値がnilだった場合、すぐに次の処理へ)
  • 得意技:
    • アロマセラピー: 周囲を癒し、安全な環境でアンラップ
    • リーフストーム: 値が存在すれば、強力な処理を実行
    • みがわり: nilの可能性を考慮し、安全策を準備
  • 性格: おくびょう (慎重にOptionalな値を確認)
let pokeball: String? = "モンスターボール"

if let ball = pokeball {
    print("ゲットだぜ!\(ball)を投げる!") // アンラップ成功時の処理
} else {
    print("ボールがない!") // アンラップ失敗時の処理
}

2. guard let

厳格な門番、ケルディオ

解説
  • タイプ: みず/かくとう (不正な値の侵入を防ぎ、安全な処理を保証)
  • 特性: せいぎのこころ (正義感を持って、nilを許さない)
  • 得意技:
    • アクアジェット: nilを検知し、素早く関数を抜ける
    • せいなるつるぎ: 正しい値のみを通過させる
    • こころのめ: 処理の意図を明確に表現
  • 性格: まじめ (ルールを厳守し、不正を許さない)
func catchPokemon(with pokeball: String?) {
    guard let ball = pokeball else {
        print("ボールがない!")
        return // 関数を抜ける
    }

    print("ゲットだぜ!\(ball)を投げる!") // アンラップ成功時の処理
}

ケルディオのように、guard letは:

  • Optionalな値がnilだった場合、早期リターン (return) や早期終了 (break, continue, throw) します。
  • Optionalな値がnilでない場合、アンラップした値を使って以降の処理を続けます。
  • ネストを浅く保ち、コードの可読性を向上させます。

willSetとdidSet

1. willSet

予言者ネイティ

解説
  • タイプ: エスパー/ひこう (未来を予知し、変化を察知する能力を表現)
  • 特性: シンクロ (他のポケモンの感情を読み取るように、プロパティの変更を検知)
  • 得意技:
    • みらいよち: プロパティが変更される直前の値を取得
    • テレキネシス: 値の変化を操り、準備を整える
    • リフレクター: 不要な変更を防ぐバリアを張る
  • 性格: れいせい (冷静に状況を分析し、適切な行動を選択)
class Pokemon {
    var nickname: String = "ピカチュウ" {
        willSet {
            print("ニックネームが\(nickname)から\(newValue)に変更されようとしています")
        }
    }
}

let pikachu = Pokemon()
pikachu.nickname = "ライチュウ"

ネイティのように、willSetは:

  • プロパティの値が変更される直前に呼び出されます。
  • 変更される前の古い値 (oldValue) にアクセスできます。
  • 値の変更をキャンセルすることはできませんが、変更前の値に基づいて何らかの処理を実行できます。

2. didSet

記録係キルリア

解説
  • タイプ: エスパー/フェアリー (変更履歴を記憶し、記録する能力を表現)
  • 特性: シンクロ (他のポケモンの感情に共感するように、プロパティの変化に反応)
  • 得意技:
    • サイコキネシス: 変更後の新しい値を取得
    • スキルスワップ: 他のプロパティと連携して処理を実行
    • トリックルーム: 変更履歴を管理し、必要に応じて参照
  • 性格: ひかえめ (変更を静かに見守り、記録に残す)
class Pokemon {
    var nickname: String = "ピカチュウ" {
        didSet {
            print("ニックネームが\(oldValue)から\(nickname)に変更されました")
        }
    }
}

キルリアのように、didSetは:

  • プロパティの値が変更された直後に呼び出されます。
  • 変更後の新しい値 (newValue) と変更前の古い値 (oldValue) にアクセスできます。
  • 値の変更に基づいて、UIの更新や他のプロパティの変更など、様々な処理を実行できます。

asyncとawait

1. async

時空を超えるディアルガ

解説
  • タイプ: はがね/ドラゴン (時間と処理の流れを操る能力を表現)
  • 特性: プレッシャー (他の処理に影響を与えず、自分のペースで時を進める)
  • 得意技:
    • ときのほうこう: 時間の流れを止め、非同期処理を開始
    • りゅうせいぐん: 強力な非同期処理を自在に操る
    • ラスターパージ: 過去の処理を消し去り、未来へ進む
  • 性格: れいせい (冷静に状況を判断し、最適なタイミングで処理を実行)
func fetchPokemonData() async throws -> String {
    // ポケモンデータを取得する非同期処理 (APIリクエストなど)
    try await Task.sleep(nanoseconds: 1_000_000_000) // 1秒待機
    return "ピカチュウをゲット!"
}

ディアルガのように、asyncは:

  • 関数を非同期関数としてマークし、時間を超越した処理を可能にします。
  • 非同期処理の開始を宣言し、他の処理をブロックせずに実行できます。
  • 時間の流れを操り、複数の非同期処理を効率的に管理できます。

2. await

時を待つパルキア

解説
  • タイプ: みず/ドラゴン (時間と処理の流れを制御する能力を表現)
  • 特性: プレッシャー (他の処理に影響を与えず、自分のペースで時を進める)
  • 得意技:
    • あくうせつだん: 非同期処理の完了を待ち、結果を受け取る
    • ハイドロポンプ: 非同期処理の結果を強力な流れに変換
    • ときのさけめ: 時間の流れを歪め、処理の順序を制御
  • 性格: おだやか (焦らず結果を待ち、確実に処理を実行)
Task {
    do {
        let result = try await fetchPokemonData()
        print(result)
    } catch {
        print("エラーが発生しました: \(error)")
    }
}

パルキアのように、awaitは:

  • 非同期処理の完了を待ち、結果を受け取ります。
  • 処理が完了するまで現在の処理を一時停止し、他の処理に実行を譲ります。
  • 非同期処理の結果に基づいて、次の処理を実行できます。