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) // 2Iterare 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 = 30Creare 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"]!) // 80displayStyle
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
// trueRiflessione 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") // 42Un 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: 2020Costi 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: hiVerifica rapida
Che cosa restituisce l'iterazione su Mirror(reflecting: value).children?
Riepilogo
Ha imparato a usare Mirror:
Mirror(reflecting:)ispeziona un valore durante l'esecuzionechildrenrestituisce coppie etichetta/valoredisplayStyleindica 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
- CustomStringConvertible
- CustomDebugStringConvertible
- Reflection con Mirror
- Creazione di tipi adatti al debug