Современный iOS-разработчик уже не пишет весь код вручную. AI-ассистенты — ChatGPT, Claude, GitHub Copilot — стали такими же инструментами, как Xcode и SwiftLint. Правильно составленный промт (запрос) может сэкономить часы работы: сгенерировать скелет вью, найти утечку памяти, оптимизировать Core Data-запрос или настроить сложный Combine-пайп. В этой подборке — 15 проверенных промтов, которые я сам использую каждый день. Каждый сопровождается реальным кодом и пояснениями. Бери и применяй.
Промты для SwiftUI
1. Генерация кастомного вью с анимацией появления
Описание: Часто нужно быстро набросать карточку или списка с анимацией fade-in. Этот промт создаёт готовое вью с модификаторами .transition и .animation.
Промт:
Создай SwiftUI вью для карточки товара (название, цена, изображение). Добавь анимацию появления: элемент выезжает снизу и становится прозрачным. Используй withAnimation и matchedGeometryEffect для плавности.
Пример результата:
struct ProductCard: View {
let product: Product
@State private var isShowing = false
var body: some View {
VStack {
// ... содержимое
}
.offset(y: isShowing ? 0 : 50)
.opacity(isShowing ? 1 : 0)
.onAppear {
withAnimation(.easeOut(duration: 0.4)) {
isShowing = true
}
}
}
}
Почему работает: Анимации на onAppear — классический UX-паттерн. Промт задаёт конкретные требования, AI не гадает.
2. Настройка NavigationStack с динамическими данными
Описание: NavigationStack заменил NavigationView. Промт генерирует корректную навигацию со ссылками и передачей данных.
Промт:
Напиши SwiftUI код для списка статей (сеть Article: id, title, body). Каждая статья должна вести на DetailView. Используй NavigationStack с NavigationLink(value:). В пункте назначения — DetailView, принимающая Article. Добавь toolbar с кнопкой "Избранное".
Пример:
struct ArticlesListView: View {
let articles: [Article]
var body: some View {
NavigationStack {
List(articles) { article in
NavigationLink(value: article) {
Text(article.title)
}
}
.navigationDestination(for: Article.self) { article in
DetailView(article: article)
}
.toolbar {
ToolbarItem {
Button("Избранное") { /* action */ }
}
}
}
}
}
Важно: Указывай конкретные типы (Article.self) — AI лучше понимает структуру.
3. Рефакторинг @State / @Observable для iOS 17+
Описание: С приходом Swift 5.9 и Observable макросов старый @StateObject код нужно обновлять. Промт помогает мигрировать.
Промт:
У меня есть класс ViewModel с @Published var items. Перепиши его на iOS 17 стиль, используя @Observable. Покажи, как изменится вью, если убрать @StateObject и заменить на @State.
Пример:
@Observable
class ItemsViewModel {
var items: [Item] = []
}
struct ItemsView: View {
@State private var viewModel = ItemsViewModel()
var body: some View {
List(viewModel.items, id: \.self) { item in
Text(item.name)
}
}
}
Совет: Всегда указывай версию iOS — AI подстроит код под новые API.
4. Создание кастомного модификатора для анимации перехода
Описание: Повторяющиеся анимации переходов между экранами удобно выносить в модификаторы.
Промт:
Создай ViewModifier под названием SlideInModifier, который анимирует появление вью слева направо с одновременным изменением непрозрачности. Добавь параметры: duration, delay. Примени модификатор к Text("Привет").
Результат: чёткий код модификатора, который легко переиспользовать.
5. Интеграция Swift Charts с динамическими данными
Описание: Swift Charts (iOS 16+) упрощают создание графиков. Промт генерирует работающий Chart с DataSet.
Промт:
Напиши SwiftUI вью, показывающую линейный график продаж по месяцам. Данные — массив структур Sale(month: String, amount: Double). Используй Chart с LineMark. Добавь ось X с месяцами, ось Y с подписями.
Промты для UIKit
6. Программная верстка Auto Layout (без storyboard)
Описание: Большинство проектов переходят на код. Промт генерирует готовый UIView с constraints.
Промт:
Создай UIView с UIImageView и UILabel, сверстанными в коде. UIImageView — квадратный, 60x60, слева. UILabel — рядом, с приоритетом сжатия = 750. Отступы по 12 по всем сторонам. Используй NSLayoutConstraint activate.
Пример:
class CustomCell: UIView {
let imageView = UIImageView()
let titleLabel = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
[imageView, titleLabel].forEach {
$0.translatesAutoresizingMaskIntoConstraints = false
addSubview($0)
}
NSLayoutConstraint.activate([
imageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12),
imageView.centerYAnchor.constraint(equalTo: centerYAnchor),
imageView.widthAnchor.constraint(equalToConstant: 60),
imageView.heightAnchor.constraint(equalToConstant: 60),
titleLabel.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 12),
titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -12),
titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
])
titleLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
}
}
Нюанс: Явно указывай translatesAutoresizingMaskIntoConstraints = false — это типичная ошибка новичков, AI её редко пропускает.
7. UICollectionView с Diffable Data Source
Описание: Diffable Data Source делает обновление коллекции безопасным и простым.
Промт:
Реализуй UICollectionView с использованием UICollectionViewDiffableDataSource. Секция одна, ячейка — стандартная. Покажи, как применить snapshot с новыми данными анимированно.
8. Кастомный UIControl для кнопки с состояниями
Описание: Когда UIButton не хватает — пишем свой UIControl.
Промт:
Напиши подкласс UIControl, который отрисовывает круглую кнопку с текстом. В состоянии highlighted меняет цвет фона и масштаб (transform). Добавь target-action для touchUpInside.
9. Помощь при миграции с UIKit на SwiftUI
Описание: Промт для создания UIViewRepresentable обёртки.
Промт:
Создай SwiftUI обёртку для UIActivityIndicatorView. Реализуй UIViewRepresentable: makeUIView, updateUIView. Параметр isAnimating должен менять состояние индикатора.
Промты для Core Data
10. Генерация модели данных с отношениями
Описание: Быстрое создание NSManagedObject подклассов в коде (если используем кодогенерацию вручную).
Промт:
Создай NSManagedObject подклассы для модели: "Author" (name, birthDate) и "Book" (title, pages, author). Отношение: один автор — много книг (to-many). Укажи @objc, dynamic var, обратное отношение books.
11. Настройка NSFetchedResultsController с секциями
Описание: FRC автоматизирует обновление таблицы при изменении данных.
Промт:
Напиши код для UITableViewController, использующий NSFetchedResultsController с секциями по полю category. Сортировка: сначала по категории, затем по дате. Реализуй делегат для автоматических обновлений.
12. Оптимизация запросов с NSPredicate и индексами
Описание: Промт генерирует сложный предикат и подсказывает, как добавить составной индекс в .xcdatamodeld.
Промт:
Напиши запрос Core Data для поиска книг, у которых title содержит "iOS", а price меньше 1000 или isFree == true. Используй NSCompoundPredicate. Укажи, какой составной индекс создать для ускорения.
13. Миграция Core Data (лёгкая и ручная)
Описание: Когда модель меняется — нужна миграция. Промт объясняет шаги.
Промт:
Объясни, как сделать лёгкую миграцию Core Data при добавлении опционального поля. Если лёгкая не подходит — опиши ручную миграцию с Mapping Model. Приведи код в NSPersistentContainer.
Промты для Combine
14. Реактивный сетевой слой с URLSession и Combine
Описание: Замена async/await на Combine для обратной совместимости.
Промт:
Напиши службу NetworkService, которая использует URLSession.dataTaskPublisher для GET запроса к JSON API. Распарси ответ в Codable модель. Обработай ошибку и заверши паблишер на главном потоке с receive(on:).
Пример:
func fetchItems() -> AnyPublisher<[Item], Error> {
let url = URL(string: "https://api.example.com/items")!
return URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.decode(type: [Item].self, decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
Почему это удобно: Паблишер легко тестировать и комбинировать с другими операторами.
15. Debounce и Throttle для поискового запроса
Описание: Избегаем лишних запросов при вводе текста.
Промт:
Создай Combine пайплайн: пользователь вводит текст в TextField -> debounce на 0.5 секунды -> удалить дубликаты -> затем отправить запрос поиска (например, в NetworkService). Подписка должна сохраняться через AnyCancellable.
Ключевой код:
$searchText
.debounce(for: .seconds(0.5), scheduler: RunLoop.main)
.removeDuplicates()
.flatMap { NetworkService.search($0) }
.sink(receiveCompletion: { _ in }, receiveValue: { results in ... })
.store(in: &cancellables)
16. Объединение нескольких паблишеров (CombineLatest)
Описание: Когда UI зависит от нескольких состояний — логин и пароль, фильтры.
Промт:
Есть два текстовых поля: email и password. Используй CombineLatest, чтобы создать паблишер, который эмитит Bool (валидна ли форма), когда оба поля непустые и email содержит "@". Подпишись, чтобы включать/выключать кнопку.
Заключение
Эти 16 промтов покрывают 80% типовых задач iOS-разработчика — от построения UI до работы с данными и реактивными потоками. Чтобы получить максимальную пользу, адаптируй промты под свой контекст: добавляй названия своих классов, версию iOS, используемые фреймворки. AI — это мощный ускоритель, но финальное решение всегда остаётся за тобой. Возьми любой промт из списка, вставь в ChatGPT (или другой AI) и убедись, как быстро приходит рабочий код. Экономь время на рутине и сосредотачивайся на архитектуре.
Комментарии