ChatGPT 5 по сравнению с ChatGPT 4-o1 при создании игры 2048

У меня есть статья, посвященная созданию с помощью ChatGPT 4-o SwiftUI iOS приложения игры 2048: “Азартная разработка iOS приложения игры 2048 с ChatGPT”. Этой статье в октябре 2025 больше года.

И вот год спустя в нашем распоряжении оказывается ChatGPT 5, существенно более мощный ИИ. И хочется проверить на той же самой задаче создания iOS приложения игры 2048 на SwiftUI, насколько более интеллектуальные и интересные решения по сравнению с Chat GPT 4-o предлагает ChatGPT 5. 

Начав работать с ChatGPT 5 вы понимаете, что общается он с вами уже как партнер класса Middle или Senior, требуя от вас того же уровня знаний. Он не дает вам подробных объяснений как начинающему iOS программисту в случае ChatGPT 4-o, a дает лишь очень краткие заметки к предлагаемому законченному коду, полагая, что в нем вы должны увидеть все его идеи. ChatGPT 5 разговаривает с вами кодом, и никаких “заглушек”, как в ChatGPT 4-o, только законченные решения. Кроме того, он опирается на более современные версии iOS и Swift.

Чтобы вы в дальнейшем вы смогли оценить те или иные решения, я очень кратко напомню правила игры 2048.
Сама игра проста. Вам дается игровое поле размером 4×4, где каждая плитка может содержать число внутри себя. 

Рис.1 Пример хода в 2048. После хода “сдвиг влево” (left) на левой доске. Доска слева станет той, что расположена на рис. справа.

Числа на игровом поле всегда будут степенью двойки. Изначально есть только две плитки с номерами 2 или 4. Вы можете менять игровое поле, нажимая на клавиши со стрелками — вверх, вниз, вправо, влево — и все плитки будут двигаться в этом направлении, пока не будет остановлены либо другой плиткой, либо границей сетки. Если две плитки с одинаковыми числами столкнутся во время движения, они сольются в новую плитку с их суммой. Новая плитка не может повторно слиться с другой соседней плиткой во время этого перемещения. После перемещения новая плитка с числом 2 или 4 случайным образом появится на одной из пустых плиток, после чего игрок делает новый ход.

Цель игры состоит в том, чтобы достичь плитки с числом 2048. Цель игры можно рассматривать более широко и достигать плитку с максимально возможным числом. На самом деле существует система подсчета очков, применяемая к каждому ходу. Счет игрока начинается с нуля и увеличивается всякий раз, когда две плитки объединяются, на значение нового числа объединенной плитки. Если нет пустой ячейки и больше нет допустимых ходов, то игра заканчивается.

Задание для ChatGPT 5 выглядит точно также, как и в случае c ChatGPT 4-o:

Вы профессиональный разработчик iOS. Предложите мне iOS-приложение игры 2048 на SwiftUI с начислением очков и кнопкой перезапуска.

Код игры 2048, написанный на SwiftUI с помощью ChatGPT 4-o  находится на Github, я не буду утомлять вас его описание, a код, написанный с помощью ChatGPT 5 — на Github.

Режимы работы приложения 2048

  1. Ручной с помощью жестов (.up, down, .left, .right)
  1. Автоматический ИИ Monte Carlo
  1. Автоматический ИИ Expectimax

ChatGPT 5 реализует  MVVM (Model-View-ViewModel) — шаблон проектирования iOS приложения. 

Читать далее

Фантастическое распознавание рукописного текста в реальном времени с помощью Vision, Apple Pencil и SwiftUI, но есть нюансы. 

Apple Pencil превратил iPad в мощный инструмент для создания заметок и творческого самовыражения. А как насчет превращения рукописных каракулей в пригодный для использования цифровой текст? Для разработчиков SwiftUI фреймворк Vision от Apple предлагает надежное решение на устройстве для оптического распознавания символов (OCR), которое бесшовно интегрируется с PencilKit, чтобы оживить распознавание рукописного ввода.

Итак, PencilKit — для ввода рукописного текста, Vision — для его распознавания, SwiftUI — для UI. 

Код находится на GitHub.

Волшебство происходит благодаря сотрудничеству двух основных фреймворков Apple:

  1. PencilKit (PKCanvasView): этот фреймворк предоставляет доску для рисования. Она позволяет пользователям писать и делать наброски естественным образом с помощью Apple Pencil или пальца, фиксируя эти данные как PKDrawing данные — векторное представление Strokes.
  2. Vision (VNRecognizeTextRequest): как только рукописный текст захвачен, Vision берет управление на себя. VNRecognizeTextRequest специально разработан для анализа изображений и идентификации текстового контента, включая сложный рукописный текст.

“Мост” между двумя Мирами: внедрение PKCanvasView в SwiftUI

Поскольку PKCanvasView является компонентом UIKit, для его интеграции в SwiftUI приложение требуется UIViewRepresentable. Эта структура действует как жизненно важный “мост”, позволяя SwiftUI управлять и отображать UIKit Views. Класс class Coordinator обычно сопровождает UIViewRepresentable для взаимодействия с методами делегатов из PKCanvasView, в частности, canvasViewDrawingDidChange(_:), который сигнализирует о том, что пользователь обновил рисунок drawing.

Читать далее

Создание SwiftUI iOS приложения “Карта с поиском”  в тандеме с ИИ Gemini 2.5 Pro Experimental 

iOS 17 принесла разработчикам SwiftUI настоящий подарок от MapKit — кучу новых фишек, которые не потребуют никаких шаманских бубнов и костылей из UIKit

  • новый Map (position:selection:content:) задает положение камеры position и отслеживает  выбор selection на карте,
  • внутрь карты Map можно добавлять аннотации, маркеры, полигоны, маршруты через обычный SwiftUI DSL (ForEach, Marker, Annotation и т.д.), который называется MapContentBuilder и позволяет строить карты декларативно, как обычный View,
  • LookAroundPreview (аналог панорам улиц) можно показать для конкретной точки на карте,  
  • теперь стандартные элементы управления картой добавляются через модификаторы: компас .mapControl(.compass), пользователь mapControl(.userLocation), масштабная линейка .mapControl(.scaleView),
  • данные поисковых подсказок  MKLocalSearchCompletion теперь легко попадают в SwiftUI через @State.

Чтобы разобраться с новыми API, я решила поработать с небольшим скромным iOS приложением, которое описывается в посте Building a searchable map with SwiftUI and MapKit  (перевод этого поста на русский находится здесь) вместе с блестящим ИИ от Google, Gemini 2.5 Pro Experimental, чтобы привести его в работоспособное состояние.

Читать далее

Google AI Studio c Gemini 2.5 для создания iOS приложения на основе макетов из Figma

Мне случайно попалось задание с собеседования 2-х годичной давности на позицию «iOS разработчик» , в котором требовалось создать iOS приложения для бронирования номера в Отеле на основе макетов экранов из Figma, в которых использовалась «карусель» из фото. 

Я решила попробовать использовать ИИ для разработки такого iOS приложения по макетам из Figma. Прямо скажем, что текст на прототипах экранов не очень отчетливо виден, так что ИИ предстоит его сначала прочитать, а уже потом создать iOS приложение.

Для меня приоритетными ИИ при создании iOS приложений являются ChatGPT 4.o-mini, Claude 3.5 (3.7) Sonnet и Grok 3, ну, может быть, DeepSeek R1, но Gemini 1.5 всегда давал хотя и корректный, но не самый лаконичный и интересный код.

Однако Gemini всегда прекрасно читал текст на изображениях ( в том числе на русском), кроме того, появилась более продвинутая Gemini 2.5 Pro Experimental —  мультимодальная, рассуждающая модель AI, которую компания называет самой интеллектуальной моделью на сегодняшний день.

Так что у нас есть все шансы на успех.

Забегая вперед, сразу скажу, что Gemini 2.5 Experimental превзошел ожидания: точное воспроизведение Figma-макетов в SwiftUI (стили, функционал) + нешаблонный код, а изобретательные решения (FlexibleGridView и др.). Стартовый код — база для масштабируемого приложения с реализацией загрузки данных с сервера (REST API). Код находится на Github.

Читать далее

Создание игральных карт в SwiftUI с помощью ИИ Grok 3

Мне всегда хотелось создать в SwiftUI «родное» View для игральных карт, не уступающее по качеству игральным картам, которые уже создал Пол Хэгерти на далеком стэнфордском курсе CS193P 2017 Лекция 6 в UIKit. Наиболее сложной частью было правильное расположение на карте символов масти для числовых карт (2 -10). Я даже интегрировала созданную Полом Хэгерти в UIKit игральную карту в SwiftUI, учитывая легкость интеграции UIViews в  SwiftUI. Но это все-таки не «родное» SwiftUI View.

Я обратилась к ИИ: Grok 3 Think, ChatGPT 3.0-mini Reason, Claude 3.7, Gemini 2.0 Flash, DeepSeek, Qwen 2.5 Max — с запросом о создании игральных карт в SwiftUI.

Самый впечатляющий результат я получила от Grok 3 Think, который предложил компактный и очень гибкий способ конструирования числовых карт (2-10) в современном SwiftUI, тот же самый способ предложил и ChatGPT 3.0-mini Reason с небольшими различиями в реализации, а вот остальные представили довольно громоздкие способы конструирования таких карт, которые фактически сводились к индивидуальным комбинациям HStack и VStack для отдельных символов масти  («♥️», «♦️», «♣️», «♠️») для каждого ранга (2-10).

Я хочу поделиться с вами протоколом взаимодействия с Grok 3 Think, в результате которого и был предложен этот самый оптимальный вариант.

Код находится на Github.

Представленный в этом посте материал может успешно использоваться для обучения программированию на SwiftUI.

Читать далее

Grok 3 xAI в разработке iOS приложения «Страны Мира» (отображение границ)

В предыдущей статье я писала о создании с помощью различных ИИ довольно простого тестовое iOS приложение Countries («Страны Мира»), которое показывает все страны Мира по регионам (Европа, Азия, Латинская Америка и т.д.) и для каждой страны отображается её название, флаг, численность населения и ВВП. Если вы выбираете какую-то страну, то на карте будет представлена страна с местоположением её столицы..

Я хочу добавить на карту границы страны:

На данный момент я ничего не знаю о том, где взять информацию о границах стран, но это должен быть либо JSON файл, либо JSON информация из интернета, которую можно считать с помощью async / await и декодировать в Swift.

Я хочу обратиться к Grok 3 xAI и попросить его написать для меня Swift код, который бы добавил границы выбранной страны на карту. 

Сразу скажу, что я не считаю, что какой-то ИИ может вместо вас написать целое iOS приложение. В лучшем случае ИИ может предложить вам действительно замечательный код с небольшим количеством ошибок (2-5), которые кстати иногда трудно найти даже опытному программисту высшей квалификации ( у меня так было с Claude 3.5 Sonnet, хотя считаю его одним из лучших ИИ для кодинга). Если вы находите эти ошибки самостоятельно или, продолжая спрашивать ИИ, вы действительно получаете высокопрофессиональное iOS приложение, потратив на его разработку существенно меньше времени.

Вот под таким углом мы и будем рассматривать нашу задачу о границах стран на карте, которую будем решать вместе с Grok 3 xAI. 

Забегая вперед, скажу, что Grok 3 xAI практически полностью справился со всеми моими запросами, предложив совершенно неожиданное для меня решение со встроенным в MapKit декодером MKGeoJSONDecoder. Тем не менее я попросила Grok 3 создать Codable Модель в Swift для декодирования GeoJSON данных, имеющих не тривиальную JSON структуру, и он с ней превосходно справился. По ходу дела Grok 3 вообще выдал целый «Комплексный обзор о получении GeoJSON данных стран» и предоставил очень четкие «рассуждения», которые вполне можно использовать как отличный обучающий материал.

Так что Grok 3 xAI в этой конкретной задаче зарекомендовал себя серьезным помощником в iOS программировании.

Код iOS приложения Countries с границами стран находится на Github.

Полностью протокол взаимодействия с Grok 3 можно посмотреть здесь. Ниже представлены лишь отдельные фрагменты этого протокола.

Читать далее

Использование DeepSeek при создании iOS приложения Countries Страны Мира. Часть 3. Swift 6 concurrency и Map.

Это продолжение. Начало находится на «Использование DeepSeek при создании iOS приложения Countries Страны Мира. Часть 1« и «Использование DeepSeek при создании iOS приложения Countries Страны Мира. Часть 2″.

Код находится на Github.

Swift 6 concurrency

Преобразуй это iOS приложение в Swift 6 concurrency версию

В результате мы получаем рассуждения, которые заняли 57 секунд:

Вот перевод этих рассуждений:

Хорошо, мне нужно преобразовать существующее приложение SwiftUI iOS для использования возможностей многопоточности Swift 6. Позвольте мне начать с того, что Swift 6 предлагает в плане многопоточности. Я знаю, что Swift 5.5 представил async / await, акторы actor и структурную многопоточность, но ожидается, что Swift 6 улучшит их более строгими проверками многопоточности, полной изоляцией акторов actor и, возможно, некоторыми новыми возможностями.
Читать далее

Использование DeepSeek при создании iOS приложения Countries Страны Мира. Часть 2. Численность населения, ВВП, флаг.

Это продолжение. Начало находится в посте «Использование DeepSeek при создании iOS приложения Countries Страны Мира. Часть 1. Список стран.».

Код находится на Github.

Корректируем поля в Индикаторе 

И опять в  улучшенной реализации с населением, ВВП, столицы и эмодзи флага мы имеем НЕВЕРНЫЙ код для ResponseMetadata 

 struct ResponseMetadata: Decodable {
            let page: Int
            let pages: Int
            let perPage: String
            let total: Int
 }

вместо ПРАВИЛЬНОГО:

struct ResponseMetadata: Decodable {
            let page: Int
            let pages: Int
            let perPage: String
            let total: Int
            
            enum CodingKeys: String, CodingKey {
                case page, pages, total
                case perPage = "per_page"
            }
 }

Но даже если мы будем использовать правильный код, мы все равно получим ту же самую ошибку: “ The data couldn’t be read because it is missing.”

Небольшая отладка и просмотр JSON данных для численности населения:

[ 
 {
    "page": 1,
    "pages": 9,
    "per_page": 30,
    "total": 266,
    "sourceid": "2",
    "lastupdated": "2025-01-28"
  },
  [
    {
      "indicator": {
        "id": "NY.GDP.MKTP.CD",
        "value": "GDP (current US$)"
      },
      "country": {
        "id": "ZH",
        "value": "Africa Eastern and Southern"
      },
      "countryiso3code": "AFE",
      "date": "2022",
      "value": 1191423176242.96,
      "unit": "",
      "obs_status": "",
      "decimal": 0
    },
....
  ]
]

… позволит определить, что поля countryiso2code, указанного в Модели  struct Entry, НЕТ в JSON данных, а есть поле countryiso3code, которое является 3-х буквенным IOS кодом страны, но это не то, что нам нужно. Нам нужен 2-х буквенный IOS код страны, который находится в id в объекте country индикатора, так что DeepSeek немного запутался. И не зря, он не рискнул взять id в объекте country response indicator, так как id в объекте Country response country — это  3-х буквенный IOS кодом страны. Нелогичность конструирования JSON данных в API World Bank приводит  DeepSeek в замешательство.

Давайте сообщим ему об этом:

В JSON indicator данных нет поля countryios2code.
Используй id из объекта country в JSON indicator данных.
Читать далее

Использование DeepSeek при создании iOS приложения Countries Страны Мира. Часть 1. Список стран.

Я решила создать довольно простое тестовое iOS приложение Countries, которое показывает все страны Мира по регионам (Европа, Азия, Латинская Америка и т.д.) и для каждой страны её название и флаг, a также численность населения population и размер ВВП (валового внутреннего продукта) gdp:

Код находится на Github.

Создание iOS приложения Countries для отображения стран Мира 

Давайте попросим DeepSeek создать полноценного iOS приложения Countries для отображения стран Мира по категориям с использованием SwiftUI и данных Всемирного Банка. 

Создай iOS приложение, которое показывает страны Мира по категориям.
Используй информацию Всемирного Банка.

Мы использовали режимы “DeepThinkingn (R1)” и «Search», который обещает применять логические выводы для получения результата:

Рассуждения 1

В результате мы получаем рассуждения, которые длятся 184 секунд (более 3 минут):

И вот их перевод:

Хорошо, мне нужно создать  iOS приложение с помощью SwiftUI, которое отображает страны мира, классифицированные с помощью API Всемирного банка. Позвольте мне разбить мои действия на шаги.
Сначала я должен выяснить, какие endpoints API Всемирного банка использовать. Пользователь упомянул категории, так что, может быть, API индикаторов indicator? Позвольте мне проверить. У Всемирного банка есть API стран countries, которое может получать список стран с информацией о регионах region, в которых они находятся. O, верно, регионы region могут быть категориями. Например, страны могут быть сгруппированы по регионам, таким как Европа, Азия и т. д.
Читать далее

Подводные камни Swift Actor: понимание и управление Reentrancy

Это перевод статьи The Swift Actor Pitfall: Understanding and Managing Reentrancy.

Введение

Сегодня я обсуждаю эту важную тему “Подводные камни Swift Actor”, так что если вы работали со Swift довольно долго, скорее всего, вы сталкивались с этим. Позвольте мне дать вам быстрое определение акторов actor — это ссылочный (reference) ТИП, похожий на класс class, но в отличие от классов позволяет только одной задаче получать доступ к своему изменяемому состоянию в один конкретный момент времени. 

Так что, как мы все знаем, гонка данных (data race) происходит только тогда, когда несколько задач пытаются получить доступ к одному и тому же изменяемому состоянию в одно и то же время. Это означает что при использовании акторов actor мы можем эффективно предотвратить гонки данные. Так ли это?

К сожалению, ответ “Нет” и причина в том, что есть actor reentrancy. Что собой в действительности представляет собой actor reentrancy и чем же actor reentrancy отличается от данных гонки (data race)? 

Читать далее