Мобильный кот
2.72K subscribers
88 photos
3 videos
2 files
87 links
Все, что считаю важным про жизнь мобильного разработчика

Шкаф с материалами
https://t.me/cat_with_mobile_cabinet
Download Telegram
Что оказалось самым сложным в использовании NonCopyable?

Осознать и найти применение коцепции некопируемых типов? Нет. Написать тильду ~, так как клавиатура по умолчанию пишет надстрочную тильду ˜.
˜Copyable vs ~Copyable.🚬

Пока только Shift + ˜ + Пробел помогает.
Please open Telegram to view this post
VIEW IN TELEGRAM
😳Data Formatting

С удивлением обнаружил, что мимо меня прошли декларативные форматтеры строк, дат, чисел (целых и с плавающей точкой), урлов и даже списков.

Все одним выражением, возможностей достаточно. Прекрасная альтернатива стандартному DateFormatter и остальным.

Парсите строки, форматируйте строки, особенно удобно показалась работа с валютами (учитывает локаль) и списками.

iOS 15+ 😏

Formatters

#swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Сколько человеко-лет нужно, чтобы Apple смогла исправить этот баг и нормально подсвечивать ошибки в SwiftUI-коде?

Периодически эта штука тратит так много времени на поиск, где же я забыл указать параметр какого-то инцииализатора, что нет сил😠
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышла Xcode 16 beta 2

🙋‍♀️На удивление первая бета была довольна стабильна и даже позволяла мне лишь с нечастыми лагами/багами пилить код. Надеюсь станет лучше. Обновляем.

Посмотреть Release notes и скачать

🙋‍♀️Напомню, что для работы с несколькими версиями Xcode я использую приложение Xcodes. И вам советую.

Xcodes
Please open Telegram to view this post
VIEW IN TELEGRAM
Актуальна ли разработка под macOS?

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

Но все изменилось, когда я пришел в Райф. К этому моменту потребность внутреннего комьюнити в инструменте для управления проектом стала очевидна: команда большая, проект сложный, сборка долгая, управлять этим хозяйством через терминал и текстовые файлики слишком затратно. На самом деле такой инструмент уже был в зачаточном состоянии, но от него хотелось получить значительно больше.

И мы с командой решили активно инвестировать в это решение, но даже не знали что нас ждет))

Три основных вывода:

1️⃣ SwiftUI для macOS - продакшн рэди .
2️⃣ То, что изначально воспринималось, как "однокнопочный UI для tuist generate и `pod install`", в результате стартануло большой рефакторинг всего проекта. Одно лишь внедрение системы кеширования модулей фича-команд привело к значительному снижению времени холодной сборки.
3️⃣ Многие крупные компании либо уже прошли активную фазу создания подобных инструментов, либо находятся в ней. Довольно активно своим опытом делится Сбер на крупных конференциях.

Количество технических и архитектурных вызовов, с которыми мы столкнулись было каким-то невероятным. И сегодня я могу сказать, что наша тулза - одна из самых интересных задач, которую мне приходилось решать за время своей карьеры разработчика.

Если в вашем проекте наклевываются или уже используются отдельные модули, причем не важно, что вы используете: cocoapods, spm, чистый tuist или свое/другое решение, то начните с изучения официального руководства Apple по системе сборки.

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

Вот краткий список основных функций, что уже внедрены:

🟢 GUI и CLI версии. CLI разрабатывается с прицелом для внедрения на CI-сервера, но активно используется и на локальных машинках.
🟢 Версионирование модулей. Имея сотни модулей от фича-команд нужно с удобством управлять их версиями.
🟢 Кеширование модулей и поддержкой ремот-кеша. Если среди сотен модулей вам нужно доработать 1-2-3, то зачем тратить время на постоянную пересборку остальных? А при условии, что они уже были собраны кем-то другим, то можно просто переиспользовать чужой кеш. На самом деле это одна из самых проблемных и неочевидных задач, особенно если говорить про инвалидацию кеша, когда при изменении одного модуля, зависящие от него не должны браться из кеша.
🟢 Вызов консольных команды из Swift. Причем с полной интеграцией со Swift Concurrency. И на самом деле сделать так, чтобы при отмене таски в Swift принудительно останавливалось выполнение запущенной консольной команды - это был взрыв мозга.
🟢 Контроль, установка и обновление окружения. С помощью единой тулзы мы обеспечиваем единое окружение: версии Xcode и необходимых зависимостей.
🟢 Автообновление. Нужно было сделать так, чтобы новые версии приложения оперативно становились доступны разработчикам и приложение обновлялось в автоматическом режиме по нажатию одной кнопки. Супер-популярный Sparkle не подошел из-за закрытой инфраструктуры и необходимости авторизации на внутренних сервисах. При этом нужно учесть, что иногда происходят ломающие изменения и новая версия нашей тулзы не сможет собрать какой-то старый коммит основного проекта. А собрать нужно.
🟢 Интеграция с git. Клонирование, чекаут, контроль текущей ветки.
🟢 Сборник часто используемых задач. Запуск очистки кешей и DerivedData. обновление паролей и токенов и многие другие задачи - нажатием одной кнопки.
Forwarded from Prefire iOS
🎯 Какой iOS-фреймворк станет номером один?

Примите участие в голосовании, чтобы вместе создать ТОП iOS-фреймворков 2024 по версии разработчиков!

📋 Что в опросе?
- Выберите фреймворки, которые вы используете каждый день.
- Добавьте свои любимые инструменты и предложите те, которые хотели бы попробовать.

Займет всего 2 минуты!

🎁 Почему стоит участвовать?
- Итоговые результаты с полезной аналитикой будут опубликованы в Telegram-канале Prefire iOS.
- Помогите собрать реальную статистику по инструментам, которые действительно используют iOS-разработчики.

🗳 Присоединяйтесь к голосованию и делитесь опросом с коллегами!

Ваш голос важен 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
С Наступающим и Наступившим Новым годом!

Этот год продолжил череду невероятных, но был совершенно иным. Не хуже, не лучше, просто иным.

Я впервые ни прочитал ни одной книги по профессиональному росту, но прочитал целую пачку художественных книг. Особенно запомнились Дорога, Бойцовский клуб, Песнь Ахилла, 1984, Призрак Оперы и Маус. Наконец прочитал Евгения Онегина и продолжаю радоваться книгам Роберта Гелбрейта. И ни одной технической книги.

Очень гуманитарный год. Хотя был отличный Мобиус, и уже готовлюсь к новому.

Смена работы, спасибо VK за бесценный опыт, спасибо Райффайзену за новый бесценный опыт🫡

Кто бы мог подумать, что под macOS я буду писать больше, чем под iOS 😄

😍 И конечно рождение дочки, невероятно долгожданной.

Этот год был по-настоящему другим. И он позволил разгрузить голову, проанализировать и накопить темы и идеи, которыми бы хотелось поделиться и очень надеюсь уже наконец дописать всю пачку книг: и по Swift 6, и по SwiftUI и по Concurrency. Все начато и не завершено.

Желаю вам невероятного роста, мирного неба, счастья, радости и профессиональных успехов!
👑 SwiftGPT: Библиотека для работы с ChatGPT

Выложил на GitHub первую версию библиотеки SwiftGPT. Она предназначена для интеграции возможностей ChatGPT в iOS/macOS/Linux проекты.

⭐️ Особенности

- Совместимость с официальным OpenAI API: интерфейс основан на стилях OpenAI.
- Поддержка Swift 6 и Swift Concurrency.
- Мультиплатформенность: работает на всех платформах Apple (iOS, macOS, watchOS, tvOS) и даже на Linux.

⬆️ Основные функции

- Поддержка Chat Completions (генерация текста)
- В планах: Assistants API, Text-to-Speech, Text Transcriptions, Image generation и др.
- Возможность указать URL для запросов (актуально для РФ, когда делаешь свой прокси)

Почему я занялся SwiftGPT

Я давно интересуюсь искусственным интеллектом и активно применяю его решения в своих проектах. Для одной из задач мне потребовался API ChatGPT, но я обнаружил, что официального SDK для iOS не существует. Сначала я задумался о создании собственной библиотеки, но обратил внимание на пакет ChatGPTSwift.

У данной библиотеки есть сильная сторона — использование OpenAPI 3.0 спецификации для сетевого слоя. То есть разработчик взял официальную спецификацию, написанную по стандарту OpenAPI 3.0, и использую
пакет от Apple - Swift OpenAPI Generator, автогенерировал сетевой слой.

На мой взгляд, это супер эффективное решение, которое позволяет упростить интеграцию с любым бекендом.

Однако, реализация ChatGPTSwift имела ряд проблем, которые требовали исправлений.

🤕 Проблемы ChatGPTSwift и их решения

- Единый монолитный класс: библиотека объединяла все функции в одном классе, что снижало читаемость и масштабируемость. Я переработал архитектуру, распределив функции в соответствии с официальным ChatGPT API.
- Неудобное API: оригинальное API библиотеки отличалось от OpenAI API. Теперь интерфейс полностью соответствует официальной документации, что минимизирует порог вхождения.
- Ошибки Swift Concurrency: вместо необоснованных решений вроде @unchecked Sendable, я внедрил корректную поддержку Swift Concurrency.
- Сложные названия типов и свойств: автогенерированные имена вроде text_event_hyphen_stream заменены на более понятные и привычные — например, textEventStream.
- Баги и устаревший API: обновил сетевой слой до актуальной версии API и устранил ошибки в логике.
- Архаичная обработка контекста токенов: библиотека обрезала контекст до 4000 токенов, хотя ChatGPT последней версии поддерживает 128 000. Это ограничение устранено.

💊 Что дальше

Переработка библиотеки — это лишь начало работы. Сейчас SwiftGPT поддерживает основные функции, но я продолжаю тестировать её в реальных проектах, а также развивать поддержку новых и существующих API OpenAI.

# Пример использования

Все максимально просто

import SwiftGPT

// Установка API key
OpenAI.Configuration.apiKey = .apiKey("your-api-key")

Task {
// создание сессии
let chat = OpenAI.Chat(model: .gpt4o)
// запрос
let response = try await chat.completions(prompt: "Как погода сегодня?")
print("Ответ: \(response)")
}

Если вам нужно интегрировать ChatGPT в iOS/macOS/Linux приложение, уже сейчас вы можете использовать SwiftGPT.

Забрать/посмотреть можно тут.

Теперь эта библиотека открыта для обратной связи и предложений сообщества!

#инструменты #ai #chatgpt
Please open Telegram to view this post
VIEW IN TELEGRAM
✍️ Об усилиях Apple и настоящем Swift

Apple открыла исходный код Swift Build - новость, которую вы точно видели. Возможно уже склонировали репозиторий swift-build, чтобы «полежало». Или может вы любите копать в суть и решили погрузиться в системы сборки и компиляторы. Кстати ранее рассказывал об интересной книге по LLVM.

Первое, что удивило меня - статистика языков в репозитории на GitHub (смотреть прикрепленное изображение). Да, Swift Build полностью написана на Swift. И даже зависимости, вроде swift-driver и swift-system, имеют практически 100%-ю реализацию на Swift.

И на самом деле это очень круто, здорово! Приятно видеть, что язык, на котором мы пишем свои убер-приложения может не только на словах использоваться для других целей, но и сама Apple развивает его, предпочитая его вместо традиционных ObjC, C/C++.

В середине 2024 года, на GitHub был создан новый аккаунт SwiftLang, куда незаметно переехал репо с самим свифтом (старый адрес https://github.com/apple/swift редеректит на этот репо). И видимо произошло это вместе с другим крупным опенсорс-анонсом - Swift Foundation.

Создается впечатление, что яблочная компания активировала усилия по расширению зоны применения Swift, создавая небольшую визуальную дистанцию между собой и языком, чтобы у разработчиков пропала стойкая ассоциация "Swift = Apple". Получается, что Apple продолжает создавать новые области его применения, и возможно "будущий вы", как Swift-разработчик, сможете найти работу не только кнопки красить.

И мне стало интересно, а что там с самим Swift'ом. Как менялся процент использования языков в самом главном репозитории. Об этом в следующем посте.
Please open Telegram to view this post
VIEW IN TELEGRAM
В продолжении предыдущего поста...

🖥 Логарифмический график изменения процентного соотношения основных языков программирования в репозитории Swift. От версии 2.2 до 6.1.

Повторю, график логарифмический, иначе низы слились бы в одну линию. Смотрите значения оси Y и подписанные циферки.

🧍‍♂ Что я сделал

Конечно же начал с клонирования репозитория Swift. Дальше нужны было найти инструмент для подсчета процентов на каждом из нужных мне коммитов. Сам GitHub для этой цели использует Ruby-приложение Linguist, которое хрен поставишь на macOS. Я начал с cloc, но цифры, которые он выдавал были странные. Оказалось, что он подсчитывает код построчно, то есть
if { 
// ...
}

дает +3 в копилку свифта, а
if { // ... }

дает +1.

И это явно не то, что нужно, так как Linguist подсчитывает код побайтово.

Оказалось, что у Linguist есть порт на языке Go - Enry. А скомпилировать go-приложение на макоси можно без вопросов, что я и сделал. Дальше муторное переключение между коммитами, заваривание чая, сбор статистики, заваривание кофе, сведение все в табличку, поиск художника для отрисовки графика.

Из графика видно, что разрыв между C++ и Swift в 2016 года был практически в 2 раза, а в последнем релизе Swift 6.1 - практически отсутствует. Objective-C++ все еще есть, хотя в Swift 5.9 появился интероп между плюсами и свифтом.

🧍‍♂ Верим в светлые времена, когда часть исходного кода плюсов будет написана на Swift, а не наоборот)
Please open Telegram to view this post
VIEW IN TELEGRAM
Что значит Swift Build для экосистемы Swift

Разработчики Tuist об аспектах выпуска Swift Build. Очень интересно почитать мысли тех, кто годами занимается низкоуровневой работой с проектами. О перспективах туиста и формата проектов.

Авторитетное мнение.
👍 Выступлению на Мобиусе 2025 быть)

Чуть позже дам подробностей, о чем будем рассказывать.
Please open Telegram to view this post
VIEW IN TELEGRAM
#доклады

Молот и наковальня iOS-разработчика

ℹ️ О чем доклад: Узнаем о macOS-приложении RaifMagic — внутреннем инструменте Райффайзен Банка. Приложение помогает автоматизировать ежедневные рабочие задачи и стандартизировать контроль качества программного кода. 

RaifMagic имеет интегрированный с Swift Concurrency механизм запуска консольных команд, самописную систему автообновления и контроля требуемой для генерации проекта версии, систему контроля и развертывания окружения, систему проверки качества кода, систему интеграции с GitLab для назначения ревьюеров на merge requests и многие другие функции. Выясним историю создания и развития инструмента.

🗣 Спикеры:

Василий Усов — автор бестселлера «Swift. Основы разработки приложений под iOS, iPadOS и MacOS». Работает в платформенной команде Райффайзен Банка, ведет блог Мобильный кот и развивает сообщество JustSwift.

Кирилл Шумаков работает в Райффайзен Банке. Любит делать красивые анимации и классные инструменты для разработчиков.

Подробности и билеты
Mobius 2025. Итоги

Было круто, если еще не бывали там - атакуйте мозг своего работодателю, чтобы отправил. Нетворкинг прекрасный. В этот раз OZON устроил чрезвычайно крутую вечеринку после первого дня, удалось и на сцене Кирпичей навалить попеть, и с Яндексом погудеть (я в Райфе, для информации).

К докладу удалось выложить в опенсорс все, что планировал. Не все в идеальном виде, не со всей докой. Но сперва год разработки, потом три месяца адовой подготовки не прошли даром.

🦄 RaifMagic
Панель управления iOS проектом. Место моего творчества последний год.

⚠️ CodeOwners
Система, управляющая отношением «файл-владелец» в проекте, и контролирующее влитие МРов в мастер. Суть в том, что разраб может влить МР только когда все заинтересованные лица поставят аппрувы. Данная система есть в составе Мейджика (см. выше), но так же может использоваться независимо. Скоро будет релиз более автоматизированной версии и, возможно, GUI на KMP под все операционки. Как сайд-эффект - вы всегда знаете, какая команда отвечает за тот или иной модуль.

💇♀️ CodeStyler
Система, контролирующая качество кода. Такой linter + danger на максималках, расширяемый, написан на Swift, с локальным GUI и интеграцией на CI. Суть в том, что пока пользователь не выполнит все правила оформления кода и ресурсов, то он не сможет влить их в репозиторий (или даже просто пушнуть). А вишенка в том, что можете писать свои правила на что угодно. Мы, к примеру, проверяем правила оформления в соответствии со swiftformat, архитектурные вопросы, форматы загружаемых изображений, а на CI еще наличие русских символов в названии ветки (оказалось капец как актуально😁)

📟 CommandExecutor
Либа для вызова shell-команд из Swift. Полная интеграция со Swift Concurrency и Swift 6.

Следующим постом приложу презентацию с доклада, но лучше смотреть доклад на сайте конференции. Надеюсь его скоро выложат на ютубчик
🫠 Прощай, Swift

Сегодня второй рабочий день в роли Техлида. Два дня уже не программировал, ломает.

А если серьезно, то теперь буду лидить разработку Райффайзен Онлайн - iOS приложения для физических лиц. Невероятно крутая возможность сделать значительный ап своих навыков. Тут и стратегия, и архитектура, и инициатива.

На фоне этого я хочу переформатировать канал. И если раньше я старался держать его только в рамках iOS-разработки, то теперь попробую рассказывать чуть шире. Будет больше постов о том, что не менее важно для мобильного разработчика, чем его код: физическое здоровье, усталость, быт, организация рабочего процесса.

Про разработку конечно не буду забывать, RaifMagic, о котором говорил выше все еще остается в моем ведении. Время от времени буду наливать смузи и кодить на SwiftUI.