10 промтов для Swift и iOS: SwiftUI, UIKit, Core Data, Combine

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 до тестирования и рефакторинга. Я рекомендую сохранить их себе в заметки и адаптировать под свои проекты. Главное — не копируйте слепо, а дорабатывайте под конкретную архитектуру. Чем точнее вы опишете контекст, тем качественнее будет ответ нейросети. Попробуйте применить хотя бы один из них сегодня — и вы увидите, как ускоряется разработка.

← Все статьи

Комментарии

Читайте также

Почему люди не используют формальные методы: разбор парадокса Vibe Coding

30 июля 2026

От повседневного к академическому английскому: Как курс Cambridge Lower Secondary ESL (0876) готовит учеников к успеху на IGCSE

30 июля 2026

Освойте AI-агентов на практике: создавайте готовые к производству агенты с интеграцией инструментов и шаблоном ReAct

30 июля 2026

Интеграция Discord с AI-агентом ASI Biont: автоматизация модерации, поддержки и уведомлений без кода

30 июля 2026

Освойте Cambridge International A-Level Economics (9708): Персонализированное обучение с помощью ИИ для AS и A2

30 июля 2026

Авиация и беспилотники: регулирование (ICAO, EASA, FAA, IATA) — как освоить международные нормы с помощью AI-обучения

30 июля 2026

Как подключить промышленный контроллер (PLC) по Modbus/TCP к AI-агенту ASI Biont и управлять им через Telegram

30 июля 2026

Гражданское право РФ: как за 30 дней освоить ГК РФ с помощью ИИ и не сойти с ума

30 июля 2026

Освоение Трудового кодекса РФ: Как курс «Трудовое право Российской Федерации» на платформе Asibiont преображает ваши юридические навыки с помощью ИИ-обучения

30 июля 2026