🔢 SwiftUI: простыми словами про some View и AnyView
В SwiftUI почти везде встречается some View. Иногда — AnyView.
Выглядят похоже, но работают по-разному. И это влияет на производительность и то, как SwiftUI обновляет экран.
🟢 Что такое some View
Когда ты пишешь:
Это значит:
“Я возвращаю конкретный тип View, просто не говорю какой именно.”
Компилятор знает точный тип. SwiftUI знает точную структуру твоего экрана.
А значит:
- ⚡ обновления работают быстрее
- 🎯 SwiftUI понимает, что именно изменилось
- 🧠 меньше лишней работы
Важно: some View должен возвращать один конкретный тип.
Вот так — ошибка: Function declares an opaque return type, but has no return statements in its body from which to infer an underlying type
Почему?
Потому что Text и Image — это разные типы.
🟢 Как правильно решить это без AnyView
Используем @ViewBuilder.
Теперь всё работает.
SwiftUI создаёт специальный тип ConditionalContent, и вся структура остаётся известной на этапе компиляции.
👉 Производительность сохраняется.
🔵 Что такое AnyView
AnyView — это стирание типа.
Пример:
Теперь SwiftUI не знает, что внутри.
Для него это просто:
“Какая-то View… посмотрим во время выполнения.”
Минусы:
- 🐢 медленнее
- ❌ SwiftUI хуже оптимизирует обновления
- 📦 превращается в "чёрный ящик"
⚠ Когда AnyView действительно нужен
Иногда без него никак:
1 Массив разных View
2 Тип неизвестен заранее (runtime)
3 API без дженериков
Если тип известен на этапе компиляции → используй some View
Если тип известен только во время выполнения →можно AnyView