0Pricing
Swift Academy · Lekcja

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)  // 2

Iterowanie 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 = 30

Budowanie 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"]!)  // 80

displayStyle

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
// true

Refleksja 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")  // 42

Uniwersalny 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: 2020

Koszty 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: hi

Szybkie sprawdzenie

Co otrzymuje się podczas iteracji po Mirror(reflecting: value).children?

Podsumowanie

Poznano Mirror:

  • Mirror(reflecting:) sprawdza wartość w czasie wykonywania
  • children zwraca pary etykieta/wartość
  • displayStyle informuje, 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

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. Refleksja za pomocą Mirror
  4. Budowanie typów przyjaznych debugowaniu
← Powrót do Swift Academy