0Pricing
Swift Academy · Урок

Отражение с помощью Mirror

Исследуйте свойства любого значения во время выполнения.

«Отражение с помощью Mirror» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое отражение

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

Создание словаря полей

С помощью отражения структуру можно преобразовать в словарь:

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 сообщает значение 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
// true

Исследование перечислений

В вариантах перечисления с ассоциированными значениями дочерний элемент содержит полезную нагрузку:

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

Затраты и ограничения рефлексии

Рефлексия медленнее прямого доступа и предназначена только для чтения — с её помощью нельзя устанавливать свойства. Используйте её для отладки, ведения журнала и вспомогательных средств сериализации, но не на критичных по времени участках.

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 сообщает, является ли значение структурой, классом, перечислением, кортежем или коллекцией
  • Доступен только для чтения и работает медленнее — отлично подходит для отладки и сериализации, но не для критичных по времени участков

Далее: создание типов, удобных для отладки.

Часто задаваемые вопросы

Урок «Отражение с помощью Mirror» бесплатный?

Да — полный текст урока «Отражение с помощью Mirror» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Отражение с помощью Mirror»?

Исследуйте свойства любого значения во время выполнения. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Отражение с помощью Mirror»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. Отражение с помощью Mirror
  4. Создание типов, удобных для отладки
← Назад к Swift Academy