Ответ
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).