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

Шкаф с материалами
https://t.me/cat_with_mobile_cabinet
Download 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
👍29🌭7🔥5
Сколько человеко-лет нужно, чтобы Apple смогла исправить этот баг и нормально подсвечивать ошибки в SwiftUI-коде?

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

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

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

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

Xcodes
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥65
Актуальна ли разработка под 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. обновление паролей и токенов и многие другие задачи - нажатием одной кнопки.
25👍13🏆7🤡2
Forwarded from Prefire iOS
🎯 Какой iOS-фреймворк станет номером один?

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

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

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

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

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

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

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

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

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

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

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

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

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

Желаю вам невероятного роста, мирного неба, счастья, радости и профессиональных успехов!
52🍾4
👑 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
🔥44👍1911🤔1🍾1
✍️ Об усилиях 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
🔥14👍32
В продолжении предыдущего поста...

🖥 Логарифмический график изменения процентного соотношения основных языков программирования в репозитории 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
👍15
Что значит Swift Build для экосистемы Swift

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

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

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

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

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

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

🗣 Спикеры:

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

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

Подробности и билеты
🔥19😁7👍2
Mobius 2025. Итоги

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

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

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

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

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

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

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

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

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

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

Про разработку конечно не буду забывать, RaifMagic, о котором говорил выше все еще остается в моем ведении. Время от времени буду наливать смузи и кодить на SwiftUI.
🔥102😁11❤‍🔥9👍7🐳32😢2🏆2