10 промтов для Swift и iOS: SwiftUI, UIKit, Core Data, Combine
Качественный prompt — это не просто запрос, а инструмент, который сокращает время на рутину и помогает сфокусироваться на архитектуре. Я собрал 10 промтов, которые использую сам в ежедневной iOS-разработке. Каждый из них решает конкретную задачу: генерацию UI, миграцию кода, работу с Core Data или Combine. Все примеры проверены на Xcode 16 и Swift 6 (июль 2026).
1. Генерация SwiftUI view с параметрами
Промт:
Создай SwiftUI view для карточки товара. Компонент должен принимать: название (String), цену (Double), рейтинг (Int от 1 до 5) и описание (String?). Используй ZStack для фонового изображения (placeholder) и VStack для текста. Добавь тень и скругления. Код должен быть Swift 6 compatible.
Пример результата:
struct ProductCard: View {
let name: String
let price: Double
let rating: Int
let description: String?
var body: some View {
ZStack(alignment: .bottomLeading) {
Color.gray.opacity(0.2) // placeholder
.frame(height: 200)
.cornerRadius(16)
.shadow(radius: 4)
VStack(alignment: .leading, spacing: 4) {
Text(name)
.font(.headline)
HStack {
Text(price, format: .currency(code: "USD"))
.font(.subheadline)
Spacer()
StarsView(rating: rating)
}
if let desc = description {
Text(desc)
.font(.caption)
.lineLimit(2)
}
}
.padding()
.background(.ultraThinMaterial)
.cornerRadius(16, corners: [.bottomLeft, .bottomRight])
}
}
}
Такой промт экономит время на написание шаблонной разметки и сразу даёт готовый компонент с кастомной логикой отображения.
2. Миграция UIKit → SwiftUI (UIViewController → View)
Промт:
У меня есть UIKit-контроллер, который использует UITableView с кастомными ячейками. Данные — массив структур User. Преобразуй логику отображения в SwiftUI, используя List и ForEach. Учти, что ячейки содержат аватар (Image), имя (Text) и кнопку подписки. Сохрани возможность обновления списка через @State или @Observable.
Пример ответа (фрагмент):
struct UserListView: View {
@State private var users: [User] = []
var body: some View {
List(users) { user in
HStack {
AsyncImage(url: URL(string: user.avatarURL))
.frame(width: 40, height: 40)
.clipShape(Circle())
Text(user.name)
Spacer()
Button(user.isSubscribed ? "Подписан" : "Подписаться") {
toggleSubscription(for: user)
}
.buttonStyle(.bordered)
}
}
}
}
Промт помогает быстро перенести логику отображения, не думая о конвертации delegate/datasource.
3. Оптимизация производительности SwiftUI (List c большими данными)
Промт:
У меня есть List с 10 000 элементов. Каждый элемент содержит HStack с изображением (AsyncImage), текстом и кнопкой. При быстром скролле наблюдаются лаги. Напиши оптимизированную версию с использованием LazyVStack внутри ScrollView, идентификацией и отложенной загрузкой изображений. Добавь возможность prefetch данных для smooth scrolling.
Ключевые рекомендации в ответе:
- Использовать LazyVStack с id: \.self и .equatable().
- Применить .task для загрузки изображений только когда элемент visible.
- Включить .listRowSeparator(.hidden) для снижения нагрузки на рендер.
4. Core Data: модель и CRUD операции
Промт:
Создай Core Data модель для хранения заметок: атрибуты title (String), body (String?), createdAt (Date). Напиши extension для NSManagedObjectContext с методами: saveNote(title:body:), fetchAllNotes(sortBy:ascending:), deleteNote(objectID:). Используй Swift 6 concurrency (actor или @MainActor).
Пример генерации:
extension NSManagedObjectContext {
@discardableResult
func saveNote(title: String, body: String?) throws -> NSManagedObject {
let note = Note(context: self)
note.title = title
note.body = body
note.createdAt = Date()
try save()
return note
}
func fetchAllNotes(sortBy key: String = "createdAt", ascending: Bool = false) throws -> [Note] {
let request = Note.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: key, ascending: ascending)]
return try fetch(request)
}
}
Такой промт даёт готовый слой работы с данными, который можно сразу вставить в проект.
5. Combine pipeline для сетевого запроса
Промт:
Напиши Combine pipeline для выполнения GET-запроса к https://api.example.com/users. Распарси JSON в массив User (Decodable). Обработай ошибки сети и декодирования. Верни Publisher<[User], Error>. Добавь retry(2) и timeout(10). Используй URLSession.dataTaskPublisher.
Результат:
func fetchUsers() -> AnyPublisher<[User], Error> {
let url = URL(string: "https://api.example.com/users")!
return URLSession.shared.dataTaskPublisher(for: url)
.retry(2)
.timeout(10, scheduler: DispatchQueue.global())
.map(\.data)
.decode(type: [User].self, decoder: JSONDecoder())
.eraseToAnyPublisher()
}
Промт сразу даёт production-ready код с обработкой ошибок.
6. Автоматические unit-тесты для iOS
Промт:
Напиши XCTestCase для тестирования функции calculateTotalPrice(items: [CartItem]) -> Double. Функция суммирует price * quantity, применяет налог 10% и округляет до двух знаков. Используй параметризованные тесты с разными наборами данных. Добавь тест для пустой корзины и больших значений.
Пример сгенерированного кода:
final class CartCalculatorTests: XCTestCase {
func testCalculateTotal() {
let items = [CartItem(price: 10.0, quantity: 2), CartItem(price: 5.0, quantity: 1)]
let total = calculateTotalPrice(items: items)
XCTAssertEqual(total, 27.5, accuracy: 0.01)
}
func testEmptyCart() {
let total = calculateTotalPrice(items: [])
XCTAssertEqual(total, 0.0)
}
}
Промт ускоряет написание тестов и повышает покрытие.
7. Рефакторинг legacy UIKit в MVVM
Промт:
У меня есть старый UIViewController с 500 строками, который напрямую работает с URLSession и обновляет UITableView. Раздели логику на ViewModel (ObservableObject) и View. ViewModel должна иметь @Published свойство items: [Item] и метод fetch(). View подписывается на изменения через Combine или @StateObject. Код должен быть Swift 6 compatible.
Ответ содержит:
- ViewModel с @Published var items: [Item] = [] и методом fetch().
- ViewController, который создаёт ViewModel и через sink обновляет tableView.
- Возможность внедрения зависимостей для тестирования.
8. SwiftUI анимированный компонент (карточка с переворотом)
Промт:
Создай SwiftUI view, который показывает карточку с вопросом. При тапе карточка переворачивается анимированно (3D-вращение по оси Y) и показывает ответ. Используй gesture и withAnimation. Дизайн: белый фон, скруглённые углы, тень.
Генерация:
struct FlashcardView: View {
@State private var isFlipped = false
let question: String
let answer: String
var body: some View {
ZStack {
RoundedRectangle(cornerRadius: 16)
.fill(.white)
.shadow(radius: 4)
VStack {
if isFlipped {
Text(answer)
.font(.body)
} else {
Text(question)
.font(.title2)
}
}
.padding()
}
.rotation3DEffect(.degrees(isFlipped ? 180 : 0), axis: (x: 0, y: 1, z: 0))
.onTapGesture {
withAnimation(.spring()) {
isFlipped.toggle()
}
}
}
}
Такой промт помогает быстро создавать анимированные компоненты для прототипов.
9. Обработка ошибок в Combine и SwiftUI
Промт:
Объедини Combine pipeline с SwiftUI: создай ViewModel, которая загружает данные, отображает ошибку (если есть) и позволяет перезагрузить. Используй enum LoadingState<T> { case loading, loaded(T), error(Error) }. Покажи пример использования с .alert и .refreshable.
Сгенерированный код включает:
- enum LoadingState<T> с generic.
- ViewModel с @Published var state: LoadingState<[Item]> = .loading.
- View, которая переключает отображение в зависимости от state.
- .refreshable для повторной загрузки.
10. Интеграция SwiftUI в UIKit через UIHostingController
Промт:
Напиши класс-обёртку для встраивания SwiftUI view в UIKit-приложение. Учти, что SwiftUI view должен принимать параметр (например, String) и отправлять событие обратно через closure. Добавь возможность обновлять параметр из UIKit после инициализации.
Пример:
class SwiftUIHostingController<Content: View>: UIHostingController<Content> {
var onEvent: ((String) -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
// дополнительные настройки
}
}
Также генерируется функция-фабрика для создания UIViewController из SwiftUI view.
Заключение
Эти 10 промтов покрывают большинство рутинных задач iOS-разработчика: от генерации UI до тестирования и рефакторинга. Я рекомендую сохранить их себе в заметки и адаптировать под свои проекты. Главное — не копируйте слепо, а дорабатывайте под конкретную архитектуру. Чем точнее вы опишете контекст, тем качественнее будет ответ нейросети. Попробуйте применить хотя бы один из них сегодня — и вы увидите, как ускоряется разработка.
Комментарии