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"]!) // 80displayStyle
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
// trueenum のリフレクション
関連値を持つ 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CustomStringConvertible
- CustomDebugStringConvertible
- Mirrorによるリフレクション
- デバッグしやすい型の構築