0Pricing
Swift Academy · レッスン

Mirrorによるリフレクション

実行時に任意の値のプロパティを調べます。

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

Mirrorとは

MirrorはSwiftの実行時リフレクションです。コンパイル時に具体的な型を知らなくても、値の構造、つまりプロパティとその値を調べられます。

Mirrorを作成する

任意の値をMirror(reflecting:)に渡します。

struct Point { let x: Int; let y: Int }
let m = Mirror(reflecting: Point(x: 1, y: 2))
print(m.children.count)  // 2

子要素を反復処理する

各子要素は、ラベルと値の組です。

struct User { let name: String; let age: Int }
let m = Mirror(reflecting: User(name: "Ann", age: 30))
for child in m.children {
    print("\(child.label ?? "?") = \(child.value)")
}
// name = Ann
// age = 30

フィールドのDictionaryを構築する

リフレクションを使うと、構造体を辞書に平坦化できます。

struct Config { let host: String; let port: Int }
let m = Mirror(reflecting: Config(host: "x", port: 80))
var dict: [String: Any] = [:]
for c in m.children { if let l = c.label { dict[l] = c.value } }
print(dict["port"]!)  // 80

displayStyle

MirrorはdisplayStyleとして、.struct、.class、.enum、.tuple、.collectionなどを報告します。そのため、値の種類に応じて処理を分岐できます。

表示スタイルの確認

リフレクションしている値の種類を判別します:

struct S { let a = 1 }
let m = Mirror(reflecting: S())
if m.displayStyle == .struct {
    print("it is a struct with \(m.children.count) field(s)")
}
// it is a struct with 1 field(s)

タプルのリフレクション

タプルは位置に基づく子要素を公開します:

let m = Mirror(reflecting: (10, "hi", true))
for c in m.children { print(c.value) }
// 10
// hi
// true

enum のリフレクション

関連値を持つ enum case では、子要素に payload が格納されます:

enum Result2 { case ok(Int); case fail(String) }
let m = Mirror(reflecting: Result2.ok(42))
print(m.children.first?.value ?? "none")  // 42

汎用フィールド出力関数

リフレクションを使うと、型に依存しないユーティリティを作成できます:

func dump2(_ value: Any) {
    for c in Mirror(reflecting: value).children {
        print("\(c.label ?? "_"): \(c.value)")
    }
}
struct Car { let make: String; let year: Int }
dump2(Car(make: "Mini", year: 2020))
// make: Mini
// year: 2020

リフレクションのコストと制限

Mirror は直接アクセスするより低速で、読み取り専用です — Mirror を通じてプロパティを設定することはできません。デバッグ、ログ出力、シリアライズ用のヘルパーに使用し、頻繁に実行される処理では使用しないでください。

struct P { let v: Int }
let m = Mirror(reflecting: P(v: 5))
print(m.children.first!.value)  // 5  (read only)

リフレクションした値のキャスト

子要素の値は Any 型として扱われます。具体的な型が必要な場合は、元の型にキャストし直してください:

struct Box { let count: Int; let label: String }
let m = Mirror(reflecting: Box(count: 3, label: "hi"))
for c in m.children {
    if let n = c.value as? Int { print("int: \(n)") }
    if let s = c.value as? String { print("str: \(s)") }
}
// int: 3
// str: hi

クイックチェック

Mirror(reflecting: value).children を反復処理すると、何が得られますか?

まとめ

Mirror について学びました:

  • Mirror(reflecting:) は実行時に値を調べます
  • children はラベルと値のペアを返します
  • displayStyle は struct / class / enum / tuple / collection の種類を示します
  • 読み取り専用で低速です — デバッグやシリアライズには適していますが、頻繁に実行される処理には適していません

次は、デバッグしやすい型を作成します。

よくある質問

「Mirrorによるリフレクション」レッスンは無料ですか?

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

「Mirrorによるリフレクション」で何を学びますか?

実行時に任意の値のプロパティを調べます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Mirrorによるリフレクション」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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