Как научиться разрабатывать мобильные приложения
Хочешь научиться разрабатывать приложения? Отлично, ведь доход у мобильных разработчиков стартует от 1000$, а все, что нужно для работы – освоить язык Java или Swift, научиться работать с API-сервером, получить навыки создания приложений для iOS и Android… В общем, нужно много всего. Но дорогу осилит идущий, и моя статья поможет тебе сделать первые шаги.

iOS vs Android: что выбрать для создания приложения?
Чтобы сделать правильный выбор, давай сравним обе операционные системы по основным параметрам.
Язык программирования
Android-приложения пишутся на языке Java, а это огромное количество кода. Приложения для iOS создаются на Swift, а он намного легче в освоении, чем Java.
Но не спеши с выбором! Android предлагает неплохую альтернативу – Kotlin. Это новый язык программирования, работающий поверх Java. Разработка на нём интуитивно понятная и обеспечивает высокую читаемость кода.
Размер экрана и разрешение
Для iOS – разработка дизайна – не проблема, поскольку Apple выпускает ограниченный выбор устройств, а под конкретные размеры всегда легче создавать продукты.
А вот с Android-приложениями будет сложнее. Смартфонов на этой ОС намного больше (80% от общего объема рынка), и все имеют свои формы и размеры. Значит приложения должны адаптироваться под любой из них.
Здесь первенство за iOS. Счет 2:1
Навигация и дизайн
Андроид-приложения состоят из секций, а iOS – из вкладок. Например, на Android устройствах есть кнопка для шага назад, а в iOS ее нет. Поэтому тебе придется мудрить, как сделать так, чтобы переходить с одной страницы на другую.
И еще одно преимущество Андроид – приложения на смартфонах выглядят более реалистично: здесь есть слои, границы, тени. Поэтому счет сравнялся 2:2.
Монетизация
App Store приносит больше прибыли разработчикам приложений, чем Google Play. Но зато в последнем скачивают в два раза больше приложений, чем в устройствах на iOS.
Поэтому счет 3:3. Ничья!
Решение за тобой. Но если ты выберешь кроссплатформенный стандарт, тогда можно вообще не мучиться с выбором.
Кроссплатформенная разработка на React Native или Flutter
Преимущество кроссплатформенных инструментов в том, что они позволяют создавать сразу два приложения одновременно. Гибридные фреймворки React Native и Flutter «подгоняют» приложение под несколько ОС, поэтому тебе не нужно создавать уникальные элементы отдельно для iOS и Android.
Для старта и создания первых простых mobile-приложений кроссплатформенная разработка – то, что нужно. Бери и пользуйся!
А что насчёт PWA?
Хороший вопрос. PWA (progressive web apps) — это web-приложения, которые можно сохранять на телефон и пользоваться ими как обычными приложениями. С 2018 года они поддерживаются всеми браузерами, а популярность их растет с каждым годом. Обрати внимание на это направление. Потому что прогрессивные web-приложения:
- Загружаются сразу, вне зависимости от качества Интернет-соединения.
- По скорости работы обгоняют обычные сайты.
- Обычно весят не больше 1 мб, что гораздо меньше стандартных приложений.
- Умеют (как и мобильные приложения):
- Высылать push-уведомления
- Работать с геолокацией
- Работать с камерой и микрофоном
Приложения на базе PWA помогают стимулировать продажи, упрощают поиск товаров и компаний, увеличивают чек… Понятно, к чему я веду? К тому, что заказы на разработку этих приложений есть и будут. Поэтому если ты ищешь перспективное направление в программировании — можешь смело приступать к изучению разработки PWA.
Вместо выводов
Вообще, mobile-разработка очень похожа на веб-разработку (точнее на frontend, об этом я писал здесь). К примеру, умея использовать React для веб-разработки, можно за считанные дни «пересесть» на работу с React Native и уже создавать кроссплатформенные мобильные приложения.
Но опять же – без практики никуда. А что еще важнее — так это возможность получать feedback от кого-то, кто разбирается в теме. Так что очень рекомендую перед началом обучения найти себе такого человека, к которому можно будет обращаться за помощью или советом.
Если среди твоих знакомых никто не нашелся — не беда. Большинство хороших курсов по программированию предоставляют поддержку наставника. Пример: курс по мобильной разработке от Skillbox . Кстати, после прохождения этого курса, тебе даже помогут трудоустроиться
Разработка приложений для iOS

Голова нам, как видите, не потребуется. Да, компания Apple приложила максимум усилий, чтобы упростить работу, исключить элементарные возможные проблемы и сократить процесс разработки мобильных приложений под их платформы, такие как: iOS, iPadOS, tvOS, macOS, watchOS. Также Apple представила в 2014 году язык программирования Swift, который очень прост для новичков и функционален для профессионалов с опытом в мобильной разработке iOS. Если вы сможете создать программу для одной платформы, к примеру для iOS, то вам не потребуется изучать дополнительные навыки программирования, чтоб создать мобильное приложение под другие технологии от Apple. Все унифицировано до такой степени, что вы можете использовать чуть ли не один и тот же код, запуская его на разных типах устройств Apple.
Создание проекта
Итак, как говорилось ранее, нам потребуется компьютер Apple (или Hakintosh — устройство под Windows, но с установленной MacOS или виртуальная машина с MacOS), и IDE Xcode, которое есть в магазине App Store в свободном доступе (бесплатно).
Давайте разберемся, что такое Xcode и зачем он нам нужен.
Программная среда разработки Xcode — это сервис, который включает в себя: редактор кода, редактор графических интерфейсов, систему контроля версий и инструменты для отладки и выкладки, написанных нами программ. Если коротко, это программа, которая позволяет решить 90% всех задач в разработке приложений под семейство операционных систем от Apple.
Скачать Xcode можно по ссылке — developer.apple.com/xcode.
Итак, запустив Xcode мы видим приветственное окно, где есть возможность для открытия, создания или клонирования проекта. Нам нужно создать новый, нажав на “Create a new Xcode project”. Да, весь интерфейс Xcode доступен только на английском языке, поэтому советую запастись англо-русским словарем.

ДАВАЙТЕ ПО-ПОРЯДКУ:

-
- Product Name — имя приложения;
- Team — команда разработки. Установим None. Это поле нам потребуется на этапе выкладки и тестирования, чтобы сертифицировать программу аккаунтом разработчика iOS;
- Organization Name — название организации которой принадлежат права на исходный код приложения. Имя организации и некоторые другие параметры будут выделены заголовком в каждом файле;
-
- Organization Identifier — идентификатор организации. Как правило, это обратный домен официального сайта. Если компания называется example и адрес в интернете у нее example.ru, то ее идентификатор будет равен ru.example;
- Bundle Identifier — идентификатор пакета. Уникальный ID, который будет использоваться при выкладке продукта в App Store и будет фигурировать при подписи программы;
- Language — язык программирования. У нас есть две опции: Objective-C и язык Swift. Первый, считается немного устаревшим, на нем, как правило, новые проекты уже не пишут, но поддерживают старые, а так как мы создаем новый — выбираем язык Swift. Отмечу, что для наших задач не потребуется писать код;
- Use Core Data — параметр, который добавит в наш проект базу данных. Она обычно используется для больших объемов данных. В рамках нашей сегодняшней работы мы не подразумеваем, что будем вообще хранить какие-либо данные, поэтому отключаем этот параметр;
- Include Unit Tests (юнит-тесты) — автоматизированное тестирование кода. Его выполнение помогает увидеть ошибки, которые могут возникнуть во время изменений в последней версии готового digital-продукта. Но так как кода у нас в принципе не будет — необходимо отключить этот параметр;
- Include UI Tests — автоматизированное тестирование пользовательского интерфейса. Отключаем этот параметр, так как у нас будет всего один элемент интерфейса для пользователя, и его невозможно протестировать;
Заполнив информацию, нажимаем Next, и выбираем место проекта на нашем компьютере, жмем Create.
ОБЗОР СРЕДЫ РАЗРАБОТКИ
У нас открывается наше основное рабочее пространство и давайте разберемся, что у нас тут есть. Т.к. интерфейс довольно сложный мы разделим его на несколько частей: вверху, слева, справа, внизу и посередине.

Также мы видим строку состояния, в которой можно наблюдать текущую задачу, выполняемую в среде разработки iOS. Правее мы можем увидеть настройки вида редактора: стандартный редактор, редактор с ассистентом и просмотр изменений в системе контроля версий, а также есть кнопки, чтобы показать/скрыть части среды, которые мы будем рассматривать далее: снизу (отладочная информация), справа (навигация) и слева (утилиты).
Слева мы видим несколько кнопок, которые будут переключать функционал левой панели, а именно:
-
-
- Навигация по файлам и папкам
- Система контроля версий
- Иерархия классов в проекте
- Поиск по проекту
- Уведомления о предупреждениях и ошибках при сборке
- Автоматизированные тесты
- Отладка
- Точки останова
- Логи сборок
Справа у нас есть две части: верхняя и нижняя. Вся правая панель — утилиты. В верхней части мы увидим настройки выбранного файла и/или элемента пользовательского интерфейса. В нижней части утилит, мы видим элементы интерфейса, которые мы можем использовать.
В нижней части программной среды разработки мы можем увидеть отладочную информацию, логи приложения и другие полезные данные, необходимые для проверки правильной работы мобильного приложения iOS. Открыть нижнюю часть, можно с помощью предпоследней кнопки в верхней части приложения, а также при запуске данная панель открывается автоматически.
И в основной (центральной) части среды мы можем наблюдать редактор, в котором пишется код и ведется работа над пользовательским интерфейсом программы.
-
-
- Identity
- Display Name — Имя программы, которое будет выводиться на домашнем экране мобильного устройства
- Bundle ID — Уникальный идентификатор, который будет использоваться в App Store
- Version — Текущая версия проекта, которая ведется, используя семантическое версионирование
- Build — Номер сборки, который стоит увеличивать на единицу с каждой установкой приложения на устройство
- Automatically manage signing — автоматическое управление подписью приложения
- Team — наименование вашей команды iOS разработчиков
- Provisioning profile — профиль, для подписи
- Signing Certificate — сертификат, который позволяет подписывать приложение в Apple
- Deployment Target — минимальная версия iOS, на которую может быть установлен разрабатываемый продукт
- Devices — Типы устройств
- iPhone
- iPad
- Универсальное
- Main Interface — Storyboard файл, с которого будет начинаться приложение после
- Device Orientation — Возможные ориентации устройства
- Портретное
- Вверх ногами
- Альбомный против часовой
- Альбомный по часовой
- Status Bar Style — Цвет статус бара (верхняя панель информации со временем, оператором и батареей)
- Светлый
- Темный
- Скрыть
- App Icons Source — иконка приложения
- Launch Screen File — экран, который показывается при запуске
Остальные пункты нам пока не потребуются.
Теперь, когда мы разобрались с тем, из чего состоит наша среда разработки, можно приступить к созданию нашего “Hello World” мобильной программы для iOS.
Создание iOS приложения с нуля

Сборка и запуск

Вопросы и ответы
Какие отличия приложений для Android и iOS следует учитывать при выборе пути разработчика?
Магазины приложений iOS, Android предлагают примерно одинаковые типы мобильных программ, но в случае с техникой Apple и их ОС, усиливается контроль качества, что исключает возможность создания клонов вашего приложения, как в случае с Android.
Что еще нужно принять во внимание перед созданием приложения?
— 80% всех гаджетов мира работают на системе Android.
+ держатели iOS-смартфонов являются более платёжеспособными и делают покупки в 3 раза чаще.
— Для iOS-разработки нужно устройство с MacOS, которое требует значительных вложений. А также требуется ежегодная оплата в AppStore, которая составляет 99$ (Аккаунт разработчика приложений в Google Play Market оплачивается один раз и навсегда, цена — 25$).
+ востребованность iOS разработчиков выше, т.к. их меньше.
И это только некоторые моменты, которые следует учитывать при выборе направления мобильной разработки. Для сравнения можете попробовать разработку Android приложения (уровень — новичок).
Как разместить мобильное приложение в AppStore и продвинуть готовый digital-продукт?
Одним из основных требований клиента при разработке поставленной бизнес-идеи являются последующее размещение и развитие (ASO-продвижение) приложения. Это довольно объёмный материал, который мы расписали в отдельных статьях.
Вывод
Вы сделали первый небольшой шаг на пути разработчика iOS. Это непростой, но очень интересный путь разработки, а в случае технологий Apple еще и очень прибыльный.
Желаем вам упорства и пусть ваш энтузиазм не угасает!
Если же вы понимаете, что самостоятельно справится будет сложно — команда Infoshell предлагает доступные цены на разработку iOS приложений под ключ. Свяжитесь с нашим специалистом для уточнения деталей!
Процесс подписания кода приложения в iOS и iPadOS

В iOS и iPadOS компания Apple предлагает такие средства обеспечения безопасности приложений, как обязательная подпись кода, строгий вход в систему для разработчиков и многие другие.
Обязательная подпись кода
После запуска ядро iOS или iPadOS определяет, какие процессы пользователей и приложения могут быть запущены в системе. Чтобы помочь проверить, что все приложения получены из известного и утвержденного источника и не подделаны, iOS и iPadOS требуют, чтобы весь исполняемый код был подписан с помощью выпущенного компанией Apple сертификата. Установленные на устройстве приложения, такие как Почта и Safari, подписаны Apple. Приложения сторонних разработчиков также должны быть проверены и подписаны с помощью выпущенного компанией Apple сертификата. Обязательная подпись кода расширяет концепцию цепочки доверия с операционной системы на приложения. Она помогает принять меры, чтобы приложения сторонних разработчиков не загружали неподписанные фрагменты кода или не использовали самомодифицирующийся код.
Процесс подписания приложений разработчиками
Разработчики могут подписывать свои приложения с помощью сертификатов (в рамках программы Apple Developer Program). Они также могут встраивать в свои приложения различные программные среды и использовать сертификаты, выданные Apple, для проверки кода (с помощью строки идентификатора команды).
- Проверка сертификата. Для разработки и установки приложений на устройствах iOS или iPadOS разработчики должны зарегистрироваться в Apple и присоединиться к программе Apple Developer Program. Перед выдачей сертификата компания Apple проверяет личность каждого разработчика, будь то частное лицо или компания, в реальном мире. Используя эти сертификаты, разработчики могут подписывать приложения и отправлять их в App Store для распространения. В результате все приложения в App Store отправляются идентифицированными людьми и организациями, что выступает в качестве сдерживающего фактора для создания вредоносных приложений. Кроме того, Apple проверяет все приложения, что помогает выявить явные ошибки или другие заметные проблемы и определить, соответствуют ли приложения своему описанию. Эта проверка дает пользователям дополнительную уверенность в качестве приложений, которые они покупают.
- Проверка подписи кода. Разработчики приложений для iOS и iPadOS могут встраивать в свои приложения различные программные среды, используемые самим приложением или встроенными в него расширениями. Чтобы защитить систему и другие приложения от загрузки стороннего кода в их адресное пространство, в момент загрузки система выполняет проверку подписи кода для всех динамических библиотек, на которые ссылается процесс. Эта проверка выполняется с помощью идентификатора команды (Team ID), который извлекается из выпущенного компанией Apple сертификата. Идентификатор команды представляет собой десятизначную буквенно-цифровую строку, например 1A2B3C4D5F. Приложение может ссылаться на любую библиотеку платформы, поставляемую вместе с системой, и любую библиотеку с таким же идентификатором команды в подписи кода, как у основного исполняемого модуля. Поскольку исполняемые модули, поставляемые с системой, не имеют идентификатора команды, они могут ссылаться только на библиотеки, которые также поставлялись с системой.
Проверка корпоративных приложений собственной разработки
У получивших разрешение компаний есть возможность разрабатывать корпоративные приложения для внутреннего пользования и распространять их среди своих сотрудников. Предприятия и организации могут подать заявку на участие в программе Apple Developer Enterprise Program (ADEP). Для получения дополнительной информации и ознакомления с условиями участия посетите веб-сайт программы Apple Developer Enterprise Program. Став участником программы ADEP, организация может зарегистрироваться и получить профиль обеспечения, который разрешает запускать корпоративные приложения собственной разработки на указанных в профиле устройствах.
Для запуска этих приложений у пользователей должен быть установлен профиль обеспечения. Эта мера направлена на то, чтобы только санкционированные организацией лица могли загружать приложения на устройства iOS и iPadOS. Приложения, установленные через систему управления мобильными устройствами (MDM), по умолчанию считаются доверенными, поскольку взаимосвязь между организацией и устройством уже установлена. В противном случае пользователям необходимо авторизовать профиль обеспечения приложения в Настройках. Организации также могут запретить пользователям одобрять установку приложений неизвестных разработчиков. При первом запуске любого корпоративного приложения собственной разработки устройство должно получить подтверждение от Apple, что это приложение разрешено запускать.
Как я создала приложение для IPhone. Без опыта разработки на SWIFT, но с помощью ChatGPT

В соцсетях часто можно встретить алармистские заявления, что ChatGPT скоро заменит ряд профессий. В том числе программистов. Мне стало интересно проверить, способен ли ChatGPT написать работающий код, без какого-либо вмешательства со стороны человека.
Важные уточнения
- Работа велась с бесплатной версией, без плагинов с доступом в интернет и тому подобного.
- Все происходило в апреле 2023 года с наиболее актуальной на тот момент версией ChatGPT.
- Процесс написания приложения занял 2 выходных дня.
- Все общение с языковой моделью велось на английском языке, так что не берусь утверждать, что на других языках, в том числе на русском, были бы схожие результаты.
- Для удобства чтения будут приводиться оригиналы и переводы на русский язык некоторых моих запросов и пересказ ответов ChatGPT.
- У меня нет никакого опыта разработки на SWIFT и проектировании мобильных приложений как таковых.
- Тем не менее за время учебы в бакалавриате я ознакомилась с принципами ООП и некоторыми языками разработки.
- Ни к каким сторонним источникам информации для чистоты эксперимента я не прибегала. Так что никакого Google или StackOverflow.
- Статья носит ознакомительный характер и не является туториалом.
Планирование
В английском языке есть поговорка, которую вольно можно перевести как «Если вы провально планируете, то вы планируете провалиться». Поэтому все началось с отбора функций будущего приложения.
: What would be the basic functions of a minimalistic to-do list iphone app?
: Какие должны быть базовые функции минималистичного to-do приложения для айфона?

ChatGPT определил следующий функционал:
- Создание задачи
- Редактирование задачи*
- Отметка задачи как выполненной
- Удаление задачи
- Установка напоминаний*
- Категоризация задач*
- Определение приоритетов задач*
- Поиск задач*
- Синхронизация между устройствами*
- Резервное копирование* и восстановление
Далеко не все вошли в финальную версию, большинство было отметено из-за сложности реализации и несоответствия идее минималистичного приложения.
*не были реализованы
Давай создадим это приложение
ChatGPT сразу же предупреждает пользователя, что, как языковая модель, он не может создать приложение. Однако предлагает свои услуги как «проводника и гида».

По запросу из заголовка чатбот выдает общий план и сообщает, что создание приложения требует большего количества деталей и времени. Но ничего, время у нас есть.
: Guide me step by step to create this app . provide me with detailed explanations and all the necessary code. note that i am a zero and am creating this app from scratch. be precise
: Проведи меня шаг за шагом в создании этого приложения. Предоставь мне детальные объяснения и весь необходимый код. Учитывай, что я полный ноль и создаю это приложение тоже с нуля. Будь точным.
На это чат сообщает, что создание полностью функционального to-do приложения с нуля — это сложный процесс, который содержит определенное количество шагов и требует знаний языков программирования и специальных инструментов. Также пишет более подробный план.
Creating a fully functional to‑do list iPhone app from scratch is a complex process that involves several steps and requires knowledge of several programming languages and tools. Here is a high‑level overview of the steps involved:
1. Choose a development platform: For developing an iPhone app, you need to use Apple’s development platform Xcode, which is available for free from the App Store. Xcode is an integrated development environment (IDE) that provides all the necessary tools for building and testing iOS apps.
2. Create a new Xcode project: Open Xcode and create a new project by selecting «File» > «New» > «Project» from the main menu. Choose the «App» option, select «iOS» as the platform, and choose «Single View App» as the template.
3. Set up the project: Name your project and set the language to Swift. Select a location to save your project, and click «Create.»
4. Design the user interface: Xcode provides a drag-and-drop interface builder that you can use to design your app’s user interface. To add a new UI element, such as a button or a text field, drag it from the Object Library and drop it onto the design canvas.
5. Implement the functionality: Once you have designed the user interface, you need to implement the functionality of your to-do list app. Start by creating a data model to store the tasks, including the task name, due date, priority, and category. You can use the Swift programming language to define your data model.
6. Create a task list: Next, create a table view controller that displays the task list. The table view should display each task as a separate row and should include buttons for marking tasks as complete, editing tasks, and deleting tasks.
7. Add functionality to the task list: Implement the functions for adding a new task, marking a task as complete, editing a task, and deleting a task. Use the UITableViewDataSource and UITableViewDelegate protocols to handle the data source and delegate methods for the table view.
8. Add reminders: Add the ability for users to set reminders for their tasks. You can use the UNUserNotificationCenter framework to create and manage reminders.
9. Categorize tasks: Add the ability for users to categorize tasks by creating a new screen that allows users to select a category for each task. You can use the UIPickerView control to create a list of categories.
10. Prioritize tasks: Add the ability for users to prioritize tasks by allowing them to assign a priority level to each task. You can use UISegmentedControl to create a list of priority levels.
11. Test the app: Test the app thoroughly to ensure that it works as intended. Use the Simulator in Xcode to test the app on different iOS devices.
12. Publish the app: Once you are satisfied with the app, publish it to the App Store so that other users can download and use it.
Please note that this is only a high-level overview of the process, and each step may require a detailed explanation and additional code. You may need to follow detailed tutorials or seek guidance from experienced developers to build a fully functional to-do list iPhone app from scratch.
Отличный план, давай ему следовать
Следующим шагом стала просьба предоставить детальное объяснение и код для каждого шага.
: Nice plan we’ll follow it. provide detailed explanation and code for each step
: Хороший план, будем ему следовать. Предоставь детальное объяснение и код каждого шага
После такого запроса ChatGPT наконец начинает давать подробные инструкции. Он сообщает, какую среду разработки выбрать, как создать проект и начать разрабатывать интерфейс. На этом моменте появляются первые строчки кода.

Пример кода
struct Task
Проблема с ChatGPT состоит в том, что есть ограничение на длину ответа. Это может стать существенной преградой в написании кода. Чат прерывается на полуслове и продолжает не всегда с того места, на котором закончил.
Далее будет пример прерванного кода:
import UIKit class ViewController: UIViewController, UITableViewDelegate < var tasks = Task var recentlyDeletedTasks = Task weak var textField: UITextField! var tableView: UITableView! override func viewDidLoad() < super.viewDidLoad() setupViews() >private func setupViews() < let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTask(:))) navigationItem.rightBarButtonItem = addButton let tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false tableView.register(UITableViewCell.self, forCellReuseIdentifier: "TaskCell") tableView.delegate = self tableView.dataSource = self view.addSubview(tableView) NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ]) >func addTask( sender: Any) < // Create a new task with the data from the text field let task = Task(name: textField.text!, dueDate: nil, priority: 1, category: "Uncategorized") // Add the task to the array tasks.append(task) // Clear the text field textField.text = "" // Dismiss the keyboard textField.resignFirstResponder() // Reload the table view to display the new task tableView.reloadData() >> extension ViewController: UITableViewDataSource < func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell < let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) if indexPath.section == 0 < let task = tasks[indexPath.row] cell.textLabel?.text = task.name >else if indexPath.section == 1 < let task = recentlyDeletedTasks[indexPath.row] cell.textLabel?.text = task.name cell.textLabel?.textColor = .red // Change the text color to red to indicate recently deleted task >return cell > func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int < if section == 0 < // Return the number of tasks in the array return tasks.count >else if section == 1 < // Return the number of recently deleted tasks return recentlyDeletedTasks.count >return 0 > func numberOfSections(in tableView: UITableView) -> Int < return 2 >func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) < if editingStyle == .delete < // Remove the task from the array let deletedTask = tasks[indexPath.row] tasks.remove(at: indexPath.row) recentlyDeletedTasks.append(deletedTask) // Delete the row from the table view tableView.deleteRows(at: [indexPath], with: .fade) >> > extension ViewController: UITableViewDelegate < func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) < tableView.deselectRow(at: indexPath, animated: true) >> extension ViewController: UITextFieldDelegate < func textFieldShouldReturn(_ textField:Для решения проблемы прерываний я прибегала к двум методам.
- Просить чат расписать решение по шагам
- Просить его привести только ту часть кода, которая интересует на данный момент.

Например так:
: To implement the hide/reveal functionality for the Recently Deleted section, you would need to replace the following block of code:
Пример кода
if !recentlyDeletedItems.isEmpty < Text("Recently Deleted") .font(.headline) .padding(.horizontal) List < ForEach(recentlyDeletedItems, id: .id) < item in HStack < Toggle(isOn: Binding(get: < self.selectedItems.contains(recentlyDeletedItems.firstIndex(of: item)!) >, set: < newValue in let index = recentlyDeletedItems.firstIndex(of: item)! if newValue < self.selectedItems.insert(index) >else < self.selectedItems.remove(index) >recentlyDeletedItems[index].isIncluded = newValue >)) < Text(item.title) >> > > .listStyle(.insetGrouped) .padding(.horizontal) > with the following code: HStack < Text("Recently Deleted") .font(.headline) .padding(.horizontal) Spacer() Button(action: < self.showingRecentlyDeleted.toggle() >) < Image(systemName: showingRecentlyDeleted ? "chevron.up" : "chevron.down") .foregroundColor(.blue) >> if showingRecentlyDeleted < List < ForEach(recentlyDeletedItems, id: .id) < item in HStack < Toggle(isOn: Binding(get: < self.selectedItems.contains(recentlyDeletedItems.firstIndex(of: item)!) >, set: < newValue in let index = recentlyDeletedItems.firstIndex(of: item)! if newValue < self.selectedItems.insert(index) >else < self.selectedItems.remove(index) >recentlyDeletedItems[index].isIncluded = newValue >)) < Text(item.title) >> > > .listStyle(.insetGrouped) .padding(.horizontal) >Порой этот метод давал сбой, ChatGPT сообщал, что часть кода не нуждается в замене. Необходимо было повторять, что от него требуется, тогда он выдавал необходимую информацию:

Но у меня нет этого файла
Временами ChatGPT «заговаривается». Начинает упоминать файлы, о которых раньше не шло и речи. Возможно он, как и многие из нас, хотел это сказать, подумал что сказал, но на самом деле нет. Предположительно это связано именно с ограничением на длину ответа. То есть эта часть текста подразумевалась, но из-за прерывания так и не была отображена пользователю. А вот для ChatGPT она все же существовала. Еще одна гипотеза основывается на вероятных источниках знаний, на которых чат обучался. Как подтверждает сам ChatGPT, он обучался на открытых источниках, в том числе на коде с GitHub и StackOverflow. Это означает, что весь генерируемыйй чатом код - это компиляция из чужих «модулей».

Так как в базе знаний ChatGPT содержится код с упомянутых платформ, в этом коде скорее всего есть импорты из иных компонент. А значит в коде от чата вполне может затесаться импорт несуществующих файлов.
ChatGPT предлагает выбрать ViewController, но такого файла нет. Приходится об этом напоминать. Чат дает инструкции, что сделать, чтобы создать файл:

Один раз я столкнулась с тем, что чат «забыл», что мы делаем приложение на IPhone, а не на Mac, и предложил решение «раз уж ты делаешь macOS приложение». Пришлось его одернуть.


Извинения от ChatGPT:

Баги, баги, баги
Процесс исправления ошибок в чатботе довольно прост. Вы копируете текст ошибки, отправляете запрос и получаете ответ. Но, к сожалению, не всегда это приводит к решению проблемы. Может произойти такое, что работаете вы с новейшим оборудованием и в последней версии среды разработки, а у ChatGPT устаревшие данные и познания о нормах. Как уже было сказано, в эксперименте не предполагалось использование внешних источников. Так что приходилось просить чат написать альтернативное решение запроса. В большинстве же случаев все заканчивалось благополучно.
Далее будет несколько примеров, как чат исправляет свои ошибки.
Тут ChatGPT извиняется за ошибку в предыдущем ответе и предлагает исправленный вариант:

Здесь он дает недостающий кусок кода:

Сообщаю чату, что проблема не исчезла. Он дает альтернативные инструкции:

Но происходили и ситуации, когда чат считал, что все ошибки уже исправлены, хотя они еще оставались, в таких ситуациях чаще всего было достаточно повторно отправить название ошибки или сообщить, что ошибки все еще имеют место:

Иногда ChatGPT приводил для исправления ровно тот же код, который нуждался в правках. Необходимо было ему об этом сообщить. Он извинялся и присылал исправленную версию.

Процесс исправления багов занял большую часть времени всего проекта, половину субботы и все воскресенье. Одним из наиболее продуктивных решений (с точки зрения исхода) стало отправлять весь код из файла и просить найти ошибку. Это давало лучшие результаты, чем пытаться десять раз спросить о конкретной ошибке.
Ниже будет пример того, что ChatGPT отвечает, если просто прислать ему простыню кода. Не требуется даже просить его найти ошибку, хотя так я тоже делала (перед вставкой кода добавить «найди ошибки»/«find errors»).
: It seems like you have defined the tableView delegate and datasource methods inside the addTask function, which is not the correct way to define them. You need to define them outside the addTask function and also make sure to conform to the UITableViewDataSource and UITableViewDelegate protocols in your ViewController class. Here's an updated code that should work:
Пример кода
import UIKit class ViewController: UIViewController < var tasks = Task weak var textField: UITextField! override func viewDidLoad() < super.viewDidLoad() setupViews() >private func setupViews() < let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTask(:))) navigationItem.rightBarButtonItem = addButton let tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false tableView.register(UITableViewCell.self, forCellReuseIdentifier: "TaskCell") tableView.delegate = self tableView.dataSource = self view.addSubview(tableView) NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ]) >func addTask( sender: Any) < // Create a new task with the data from the text field let task = Task(name: textField.text!, dueDate: nil, priority: 1, category: "Uncategorized") // Add the task to the array tasks.append(task) // Clear the text field textField.text = "" // Dismiss the keyboard textField.resignFirstResponder() // Reload the table view to display the new task tableView.reloadData() >> extension ViewController: UITableViewDataSource < func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) ->Int < // Return the number of tasks in the array return tasks.count >func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell < // Dequeue a reusable cell from the table view let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) // Get the task for this row let task = tasks[indexPath.row] // Configure the cell with the task data cell.textLabel?.text = task.name return cell >func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) < if editingStyle == .delete < // Remove the task from the array tasks.remove(at: indexPath.row) // Delete the row from the table view tableView.deleteRows(at: [indexPath], with: .fade) >> > extension ViewController: UITableViewDelegate
: Make sure to replace Task with your own Task model class. I hope this helps!
Однако, можно столкнуться с тем, что чат просто начнет рассказывать, что делает ваш код. Так что лучше все же добавлять просьбу найти баги.
This code defines a SwiftUI view for a todo list app. It includes a list of todo items, a way to add new items, and the ability to delete items and move them to a "Recently Deleted" section. The user can also select multiple items at once and perform actions on them, such as deleting or restoring them.
The TodoItem struct defines the properties of a todo item, including a unique identifier, a title, a boolean value indicating whether the item is completed, and a boolean value indicating whether the item is included in the list of recently deleted items.
The view includes several state variables, including selectedItems (a set of indices of selected items), showingRecentlyDeleted (a boolean indicating whether the "Recently Deleted" section is currently shown), newItemTitle (a string representing the title of a new item being added), isOn (a boolean representing the state of a switch control), todoItems (an array of TodoItem objects representing the current list of todo items), recentlyDeletedItems (an array of TodoItem objects representing the list of recently deleted items), and showingDeleteAlert (a boolean indicating whether the user has requested to delete an item).
The view includes a List view that displays the current list of todo items, with each item represented by a HStack containing a checkbox, the item title, and a trash can icon. The user can tap the checkbox to mark an item as completed, tap the title to select an item, and tap the trash can icon to delete an item.
The view also includes a HStack containing a text field and a button to add a new todo item to the list.
Finally, the view includes a section for recently deleted items that can be expanded or collapsed by tapping a chevron icon. Each recently deleted item is represented by a HStack containing a checkbox, the item title, and a button to restore the item. The user can select multiple items by tapping the checkboxes and can restore them all at once by tapping a "Return Selected Items" button.
Больше функций. И багов.
Пожалуй, самым проблемным было внедрение функций, которых не было в изначальном плане ChatGPT. Со временем добавились папка с удаленными задачами и возможность восстановления пунктов списка задач.
В процессе добавления новых функций потерялась возможность отмечать выполненными несколько пунктов. Сколько бы попыток поиска ошибки не предпринималось (около 5 часов однотипных запросов, в том числе копий всего кода), это не давало никаких результатов, чат упорно не видел ни единой ошибки.

Причина неработающей функции так и не была найдена. Знаний чатбота на данном этапе на это не хватает.
Выводы
Написать приложение с нулевыми знаниями языка программирования, используя ChatGPT, оказалось вполне возможно. Есть несколько «но», которые стоит учитывать:
- Понадобится определенное количество времени(около получаса), чтобы подобрать правильный запрос и вывести бота на нужные рельсы.
- Приложение должно быть довольно простым. Попытки написать полноценное приложение для ведения бюджета успехом не увенчались, ChatGPT давал неработающие API и советовал воспользоваться библиотеками, которые уже не поддерживаются. У меня не получилось, но в твиттере я натыкалась на тред человека, который смог создать как минимум конвертер валют.
- Будет много ошибок в коде. В среднем выходило 1-2 ошибки на каждый кусок кода, который ChatGPT выдавал. Не все из них удастся исправить силами одного лишь чатбота.
- Большую часть времени (75% по моему опыту) займет устранение ошибок. Остальные шаги, включая планирование функционала и дизайна интерфейса, отнимут не более нескольких часов.
Если среди вас найдутся эксперты в SWIFT, была бы благодарна, если бы вы оценили качество кода, который сгенерировал ChatGPT.
- Identity
-
-