Refleksja za pomocą Mirror
Sprawdzanie właściwości dowolnej wartości w czasie działania.
Refleksja za pomocą Mirror to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Czym jest Mirror
Mirror to refleksja Swift w czasie wykonywania: pozwala analizować strukturę wartości — jej właściwości i wartości tych właściwości — bez znajomości konkretnego typu w czasie kompilacji.
Tworzenie obiektu Mirror
Dowolną wartość należy przekazać do Mirror(reflecting:):
struct Point { let x: Int; let y: Int }
let m = Mirror(reflecting: Point(x: 1, y: 2))
print(m.children.count) // 2Iterowanie po elementach podrzędnych
Każdy element podrzędny jest parą etykiety i wartości:
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 = 30Budowanie słownika pól
Refleksja może spłaszczyć strukturę do słownika:
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 udostępnia właściwość displayStyle — .struct, .class, .enum, .tuple, .collection itd. — dzięki czemu można rozgałęziać kod na podstawie rodzaju wartości.
Sprawdzanie stylu wyświetlania
Należy określić, jaki rodzaj wartości jest poddawany refleksji:
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)Refleksja nad krotką
Krotki udostępniają dzieci uporządkowane pozycyjnie:
let m = Mirror(reflecting: (10, "hi", true))
for c in m.children { print(c.value) }
// 10
// hi
// trueRefleksja nad wyliczeniami
W przypadku przypadków wyliczenia z wartościami skojarzonymi dziecko zawiera dane:
enum Result2 { case ok(Int); case fail(String) }
let m = Mirror(reflecting: Result2.ok(42))
print(m.children.first?.value ?? "none") // 42Uniwersalny drukujący pola
Refleksja umożliwia tworzenie narzędzi niezależnych od typu:
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: 2020Koszty i ograniczenia refleksji
Mirror działa wolniej niż bezpośredni dostęp i jest tylko do odczytu — nie można za jego pomocą ustawiać właściwości. Należy używać go do debugowania, rejestrowania i pomocniczej serializacji, a nie w często wykonywanych fragmentach kodu.
struct P { let v: Int }
let m = Mirror(reflecting: P(v: 5))
print(m.children.first!.value) // 5 (read only)Rzutowanie wartości poddanych refleksji
Wartości dzieci mają typ Any; gdy potrzebny jest konkretny typ, należy rzutować je z powrotem:
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: hiSzybkie sprawdzenie
Co otrzymuje się podczas iteracji po Mirror(reflecting: value).children?
Podsumowanie
Poznano Mirror:
Mirror(reflecting:)sprawdza wartość w czasie wykonywaniachildrenzwraca pary etykieta/wartośćdisplayStyleinformuje, czy chodzi o strukturę, klasę, wyliczenie, krotkę czy kolekcję- Jest tylko do odczytu i działa wolniej — świetnie nadaje się do debugowania i serializacji, ale nie do często wykonywanych fragmentów kodu
Następnie: tworzenie typów przyjaznych debugowaniu.
Często zadawane pytania
Czy lekcja „Refleksja za pomocą Mirror” jest bezpłatna?
Tak — pełny tekst „Refleksja za pomocą Mirror” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Refleksja za pomocą Mirror”?
Sprawdzanie właściwości dowolnej wartości w czasie działania. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Refleksja za pomocą Mirror”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- CustomStringConvertible
- CustomDebugStringConvertible
- Refleksja za pomocą Mirror
- Budowanie typów przyjaznych debugowaniu