Что такое Reflection (отражение) в Swift?

«Что такое Reflection (отражение) в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Reflection (отражение) — это механизм интроспекции, позволяющий анализировать структуру, свойства и другие метаданные типа во время выполнения программы. В Swift он реализован через тип Mirror и является ограниченным по сравнению с некоторыми другими языками (например, Objective-C Runtime).

Основное применение: отладка, сериализация/десериализация (JSON, Codable), создание универсальных инструментов (например, логгеров).

Пример использования Mirror:

struct User {
    let name: String
    let age: Int
    let email: String?
}

let user = User(name: "Анна", age: 28, email: nil)
let mirror = Mirror(reflecting: user)

print("Тип объекта: (mirror.subjectType)")
print("Детали:")

for child in mirror.children {
    if let label = child.label {
        print("  Свойство '(label)': (child.value)")
    }
}
// Вывод:
// Тип объекта: User
// Детали:
//   Свойство 'name': Анна
//   Свойство 'age': 28
//   Свойство 'email': nil

Важные ограничения в Swift:

  • Только для чтения: Mirror не позволяет изменять значения свойств.
  • Нет доступа к методам: Нельзя получить список или вызвать методы экземпляра.
  • Производительность: Создание Mirror и обход свойств — относительно медленные операции, не предназначенные для частого вызова в критичных по производительности участках кода.
  • Для сложной интроспекции или модификации объектов может потребоваться использование Objective-C Runtime (для классов, наследующих NSObject).