0Pricing
Swift Academy · レッスン

デバッグしやすい型の構築

説明文とリフレクションを効果的に組み合わせます。

「デバッグしやすい型の構築」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ツールの組み合わせ

優れた型は調べやすいものです。CustomStringConvertible、CustomDebugStringConvertible、Mirror を組み合わせると、値を明確に出力し、必要に応じて内部構造を確認できるようになります。

簡潔な description

まず、ユーザー向けの出力を定義します:

struct Vector: CustomStringConvertible {
    let x: Double
    let y: Double
    var description: String { "(\(x), \(y))" }
}
print(Vector(x: 1, y: 2))  // (1.0, 2.0)

診断用の debugDescription を追加

デバッグ用の詳細情報を追加します:

struct Vector: CustomStringConvertible, CustomDebugStringConvertible {
    let x: Double
    let y: Double
    var description: String { "(\(x), \(y))" }
    var debugDescription: String { "Vector(x: \(x), y: \(y), len: \(length))" }
    var length: Double { (x * x + y * y).squareRoot() }
}
debugPrint(Vector(x: 3, y: 4))  // Vector(x: 3.0, y: 4.0, len: 5.0)

Mirror で description を自動生成

リフレクションを使うと、すべてのフィールドを手作業で列挙せずに description を作成できます:

struct Auto: CustomStringConvertible {
    let a = 1
    let b = "x"
    var description: String {
        let fields = Mirror(reflecting: self).children
            .map { "\($0.label ?? "_")=\($0.value)" }
            .joined(separator: ", ")
        return "Auto(\(fields))"
    }
}
print(Auto())  // Auto(a=1, b=x)

再利用可能なリフレクションヘルパー

Mirror の処理を free function に切り出すと、多くの型で同じデバッグフォーマッターを共有できます。

共有の describe ヘルパー

1 つのヘルパーをどこでも再利用できます:

func reflectiveDescription(_ value: Any) -> String {
    let name = String(describing: type(of: value))
    let parts = Mirror(reflecting: value).children
        .map { "\($0.label ?? "_"): \($0.value)" }
        .joined(separator: ", ")
    return "\(name)(\(parts))"
}
struct P { let id = 7; let tag = "z" }
print(reflectiveDescription(P()))  // P(id: 7, tag: z)

プロトコルのデフォルト実装

プロトコル拡張を使って、型のファミリー全体にリフレクション対応のデバッグ機能を提供します:

protocol Inspectable: CustomStringConvertible {}
extension Inspectable {
    var description: String {
        let parts = Mirror(reflecting: self).children
            .map { "\($0.label ?? "_")=\($0.value)" }
            .joined(separator: ", ")
        return "\(type(of: self))[\(parts)]"
    }
}
struct Widget: Inspectable { let w = 10; let h = 20 }
print(Widget())  // Widget[w=10, h=20]

ネストした値の整形出力

子要素自体が出力可能であれば、リフレクションは自然に再帰します:

struct Inner: CustomStringConvertible { let v = 1; var description: String { "Inner(\(v))" } }
struct Outer: CustomStringConvertible {
    let inner = Inner()
    var description: String { "Outer(\(inner))" }
}
print(Outer())  // Outer(Inner(1))

Swift の dump の使用

組み込みの dump は Mirror を使って、深くインデントされたツリーを出力します — 手早い確認に便利です:

struct Node { let id = 1; let kids = [2, 3] }
dump(Node())
// - id: 1
// - kids: 2 elements ...

すべてを組み合わせる

洗練された型では、簡潔な description、豊富なデバッグ情報、リフレクションによるフォールバックを備えます — ログに出力しやすく、デバッグもしやすくなります。

struct Order: CustomStringConvertible, CustomDebugStringConvertible {
    let id: Int
    let total: Double
    var description: String { "Order #\(id)" }
    var debugDescription: String { "Order(id: \(id), total: \(total))" }
}
let o = Order(id: 5, total: 9.99)
print(o)       // Order #5
debugPrint(o)  // Order(id: 5, total: 9.99)

リフレクションによるフィールド数のカウント

リフレクションは、プロパティ数のカウントなど、構造に関する簡単なアサーションにも便利です:

struct Profile { let name = "A"; let age = 1; let city = "X" }
let fieldCount = Mirror(reflecting: Profile()).children.count
print("Profile has \(fieldCount) fields")  // Profile has 3 fields

クイックチェック

すべてのプロパティを手作業で列挙せずに description を作成するには、どうすればよいですか?

まとめ

デバッグしやすい型の作成方法を学びました:

  • description(簡潔)と debugDescription(詳細)を組み合わせる
  • Mirror を使って子要素から description を自動生成する
  • リフレクションをヘルパーまたはプロトコルのデフォルト実装に切り出す
  • dump はリフレクションした深いツリーを出力し、手早い確認に使える

コース完了です!

よくある質問

「デバッグしやすい型の構築」レッスンは無料ですか?

はい。「デバッグしやすい型の構築」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「デバッグしやすい型の構築」で何を学びますか?

説明文とリフレクションを効果的に組み合わせます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「デバッグしやすい型の構築」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. Mirrorによるリフレクション
  4. デバッグしやすい型の構築
← Swift Academyに戻る