0Pricing
Swift Academy · Lezione

Reflection con Mirror

Ispezioni a runtime le proprietà di qualsiasi valore.

Reflection con Mirror è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Che cos'è Mirror?

Mirror è il sistema di reflection del runtime di Swift: consente di esaminare la struttura di un valore, cioè le sue proprietà e i relativi valori, senza conoscere il tipo concreto al momento della compilazione.

Creare un Mirror

Passi qualsiasi valore a Mirror(reflecting:):

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

Iterare sui children

Ogni child è una coppia label/valore:

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

Creare un Dictionary dei campi

La reflection può appiattire una struct in un dizionario:

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 segnala un displayStyle, ad esempio .struct, .class, .enum, .tuple, .collection e così via, consentendo di scegliere un comportamento in base al tipo di valore.

Ispezionare lo stile di visualizzazione

Rilevi il tipo di valore su cui sta eseguendo la reflection:

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)

Riflessione su una tupla

Le tuple espongono elementi posizionali:

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

Riflessione sugli enum

Nei casi di enum con valori associati, l'elemento figlio contiene il payload:

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

Un visualizzatore generico dei campi

La reflection consente di creare utilità indipendenti dal tipo:

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

Costi e limiti della reflection

Mirror è più lento dell'accesso diretto ed è di sola lettura — non è possibile impostare le proprietà tramite questo strumento. Lo usi per il debug, il logging e gli helper di serializzazione, non nei percorsi critici.

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

Eseguire il cast dei valori riflessi

I valori degli elementi figli sono tipizzati come Any; esegua di nuovo il cast al tipo concreto quando ne ha bisogno:

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

Verifica rapida

Che cosa restituisce l'iterazione su Mirror(reflecting: value).children?

Riepilogo

Ha imparato a usare Mirror:

  • Mirror(reflecting:) ispeziona un valore durante l'esecuzione
  • children restituisce coppie etichetta/valore
  • displayStyle indica se si tratta di struct, class, enum, tuple o collection
  • È di sola lettura e più lento — ottimo per il debug e la serializzazione, ma non per i percorsi critici

Successivamente: costruire tipi facili da analizzare durante il debug.

Domande Frequenti

La lezione «Reflection con Mirror» è gratuita?

Sì — il testo completo di «Reflection con Mirror» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Reflection con Mirror»?

Ispezioni a runtime le proprietà di qualsiasi valore. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Reflection con Mirror»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. Reflection con Mirror
  4. Creazione di tipi adatti al debug
← Torna a Swift Academy