По данным Bloomberg, Apple ведет переговоры с Google о сделке на $1 ИИ-модели Gemini для обновленной Siri. Это одно из самых неожиданных технологических партнерств года.
Что происходит:
🔹 Apple будет использовать 1.2 триллионную модель Google Gemini для новых функций Siri.
🔹 Сумма контракта около $1 миллиарда в год.
🔹 Обновленная Siri с кодовым именем Linwood выйдет весной 2026 года в iOS 26.4.
Технические детали:
Gemini будет отвечать за две ключевые функции:
🔹 Суммаризация: сжатие и обобщение информации.
🔹 Планирование: выполнение сложных многошаговых задач.
При этом основные функции Siri останутся на собственных моделях Apple. Важно: все вычисления будут происходить на серверах Apple Private Cloud Compute без доступа Google к пользовательским данным.
Почему это важно:
🔹 Признание отставания: Apple официально признает, что отстала в ИИ-гонке.
🔹 Временное решение: это временное решение, пока Apple не догонит по качеству.
🔹 Стратегический ход: лучше временное партнерство, чем полная потеря рынка.
Что будет дальше:
Apple уже разрабатывает собственную модель на 1 триллион параметров и надеется заменить Gemini уже в 2026 году, но догнать Google, которая постоянно улучшает Gemini, будет непросто.
Это напоминает ситуацию с поиском в Safari, где Google платит Apple миллиарды за статус поиска по умолчанию. Теперь роли поменялись: Apple платит Google. Для пользователей это в целом хорошая новость: Siri станет значительно умнее.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14🤯6🔥5👀2🫡1
Добрый день! Сегодня поговорим о том, как правильно готовить проекты к будущим обновлениям Swift. Оказывается, многие до сих пор мигрируют вручную, хотя Apple давно предоставила удобные инструменты.
Зачем это нужно?
Каждый год Swift становится лучше, но новые фичи часто ломают обратную совместимость. Вместо того чтобы тратить недели на ручную правку кода, можно использовать встроенные инструменты миграции.
Как это работает:
В настройках сборки Xcode есть секция «Upcoming Features». Там можно включить режим миграции для конкретной фичи:
🔹 Выбираете фичу из выпадающего списка.
🔹 Включаете Migrate вместо Enabled.
🔹 Собираете проект и изучаете замечания.
🔹 Применяете автоматические фиксы.
Пример.
Допустим, у вас есть код:
class DataProcessor {
func processData() async {
// Какая-то логика
}
}После включения миграции Xcode покажет предупреждение и предложит добавить
@concurrent: class DataProcessor {
@concurrent func processData() async {
// Теперь код готов к будущим изменениям
}
}Почему опасно мигрировать вручную:
Рассмотрим конкретный пример. Без миграционного инструментария вы можете не заметить, что ваш асинхронный метод внезапно начал выполняться на главном потоке, хотя раньше работал в фоне. Результат: тормозящий интерфейс и недовольные пользователи.
Преимущества автоматической миграции:
🔹 Безопасность: инструмент знает все нюансы изменений.
🔹 Скорость: минуты вместо дней/недель.
🔹 Обучение: каждое замечание содержит подробное объяснение.
🔹 Консистентность: правки в едином стиле по всему проекту.
Работает для Swift Package Manager.
Тот же подход работает и для пакетов через swift-settings в Package.swift:
.target(
name: "MyLibrary",
swiftSettings: [
.enableUpcomingFeature("StrictConcurrency")
]
)
Swift Migration Tooling - это не просто удобная фича, а необходимость для поддержания кодовой базы в актуальном состоянии. Инвестируйте время в изучение этих инструментов, они окупятся многократно при следующем серьезном обновлении Swift.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Кот Денисова
Всем привет! Казалось бы, что еще нужно для счастья? Высокая зарплата, возможность работать удаленно, интересные задачи. Но многие из нас просыпаются с ощущением, что что-то не так. Давайте разберемся, что мешает нам чувствовать себя счастливыми в профессии.
Стирание границ между работой и жизнью.
Работа постепенно поглощает все: вечер перетекает в ночь, ноутбук лежит рядом с кроватью, мысли о багах не отпускают даже во сне.
Как решить данную проблему:
Отсутствие настоящего отдыха.
У многих разработчиков вообще нет хобби. Весь свободное время уходит на курсы, пет-проекты и изучение новых технологий, но это не отдых, а продолжение работы.
Как решить данную проблему:
Найдите занятие, которое не имеет практической пользы:
Социальная изоляция.
Удаленная работа лишает нас спонтанных разговоров у кофемашины, шуток в коридоре, простого человеческого общения.
Как решить данную проблему:
Синдром самозванца.
«Я недостаточно знаю», «Все вокруг умнее», «Мне просто повезло». Эти мысли знакомы почти каждому разработчику.
Как решить данную проблему:
Заведите журнал достижений и регулярно записывайте:
Постоянное сравнение с другими.
Соцсети создают иллюзию, что все вокруг запускают стартапы, путешествуют и достигают невероятных успехов.
Как решить данную проблему:
Хронический стресс.
Легаси-код, дедлайны, ночные релизы, баги в пятницу вечером - разработка это не только творчество, но и постоянный хаос.
Как решить данную проблему:
Отсутствие смысла.
Можно хорошо зарабатывать, работать с крутыми технологиями, но чувствовать, что твои усилия не меняют ничего важного.
Как решить данную проблему:
Нестабильный ритм жизни.
Дежурства, аварии, ночные правки, когда ты не контролируешь свое время, это подрывает нервную систему.
Как решить данную проблему:
Токсичная культура продуктивности.
Пока ты спишь, твой конкурент работает - этот подход выжимает все соки и приводит к выгоранию.
Отдых - это часть продуктивности. Мозг восстанавливается, когда вы ничего не делаете.
Страх просить о помощи.
Ментальное здоровье в ИТ до сих пор считается чем-то постыдным. Люди молчат, хотя внутри уже горят.
Обращение к психологу - это не слабость, а ответственность перед собой и проектом.
Счастье в программировании оказывается гораздо ближе к простым человеческим вещам, чем к технологиям или зарплате. Оно рождается там, где находится баланс между работой и личной жизнью, где есть место настоящему отдыху без чувства вины и живому общению без мессенджеров.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20👍10👀4🔥2🙏1
Всем привет! Сегодня разберем механизм AutoreleasePool - наследие Objective-C, которое продолжает играть важную роль в управлении памятью Swift-приложений. Этот инструмент особенно актуален при работе с ресурсоемкими операциями.
Принцип работы AutoreleasePool:
AutoreleasePool функционирует как отложенный менеджер памяти. В отличие от немедленного освобождения объектов при выходе из области видимости, система собирает их в специальный пул. Очистка происходит при явном вызове drain() или по завершении текущего runloop-цикла.
Пример:
for i in 0..<5000 {
// Data работает с байтами (UInt8)
// Каждый элемент занимает 1 байт. 1024 * 1024 = 1 МБ
let data = Data(repeating: 0, count: 1024 * 1024) // 1 MB
processData(data)
}
В этом случае в памяти одновременно может находиться до 5 GB данных, поскольку объекты не уничтожаются до завершения цикла.
Оптимизированный подход:
for i in 0..<5000 {
autoreleasepool {
let data = Data(repeating: 0, count: 1024 * 1024) // 1 MB
processData(data)
}
}
Теперь каждый экземпляр Data уничтожается после итерации, сохраняя стабильное потребление памяти.
Исторический контекст и современность:
В Objective-C разработчики вручную управляли пулами через NSAutoreleasePool. Swift сохранил эту функциональность через синтаксис autoreleasepool {}, хотя в большинстве сценариев ARC успешно справляется самостоятельно.
Критические сценарии применения:
Подробные статьи:
AutoreleasePool остается специализированным инструментом для оптимизации пикового потребления памяти. Его разумное применение особенно важно в высоконагруженных приложениях, где контроль за памятью напрямую влияет на производительность и стабильность приложения.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
С выходом iOS 26 разработчики UIKit получают расширенные возможности для работы с цветом, что особенно важно в эпоху HDR-дисплеев и повышенных требований к визуальному качеству приложений.
HDR-цвета в стандартных компонентах:
Одним из наиболее значимых обновлений стала поддержка HDR-цветов в UIColorPickerViewController и UIColorWell. Новое свойство maximumLinearExposure позволяет задавать максимальную яркость для цветов с расширенным динамическим диапазоном. Значение больше 1 активирует дополнительный слайдер «HDR Boost», дающий пользователям возможность тонко настраивать экспозицию выбранного цвета.
Это открывает новые горизонты для приложений, где важна точная цветопередача: графических редакторов, приложений для обработки фото, дизайнерских инструментов и любых продуктов, требующих работы с широким цветовым охватом.
Пример:
// Настройка пикера для профессиональной работы с цветом
let colorPicker = UIColorPickerViewController()
colorPicker.supportsEyedropper = true
colorPicker.maximumLinearExposure = 2.0 // Расширенный диапазон яркости
// Для UIColorWell в кастомных интерфейсах
let colorWell = UIColorWell()
colorWell.supportsEyedropper = true
colorWell.maximumLinearExposure = 1.8
Пипетка становится публичным API:
Свойство supportsEyedropper, ранее доступное только как приватный API в iOS 18, теперь официально документировано и доступно для использования. Эта функция позволяет включать или отключать инструмент «пипетка» в интерфейсе выбора цвета. При активации пользователи могут выбирать цвета напрямую с экрана своего устройства, что значительно ускоряет рабочий процесс и повышает точность подбора цветов.
Пример:
// В фоторедакторе быстрый захват цвета с изображения
func setupColorPickerForPhotoEditing() {
let picker = UIColorPickerViewController()
picker.supportsEyedropper = true
picker.maximumLinearExposure = 1.5
present(picker, animated: true)
}
// В дизайнерском инструменте точный подбор цветов
func createDesignColorWell() -> UIColorWell {
let well = UIColorWell()
well.supportsEyedropper = true
well.maximumLinearExposure = 1.2
return well
}
Практическая значимость для разработчиков:
Эти обновления демонстрируют тенденцию к унификации инструментов выбора цвета между платформами. Теперь UIKit предлагает функциональность, сравнимую с современными веб-решениями и нативными инструментами других операционных систем.
Для разработчиков это означает сокращение необходимости в создании кастомных решений для работы с цветом. Стандартные компоненты теперь покрывают большинство сценариев использования, включая профессиональные задачи, связанные с точным подбором и настройкой цветов.
Новые возможности UIColorPickerViewController и UIColorWell в iOS 26 значительно расширяют инструментарий разработчика для работы с цветом. Поддержка HDR-цветов через maximumLinearExposure и официальный доступ к инструменту «пипетка» через supportsEyedropper превращают стандартные компоненты в профессиональные решения для современных приложений.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16 9🔥4❤2🗿1 1
This media is not supported in your browser
VIEW IN TELEGRAM
Сегодня поговорим о важном обновлении в экосистеме Swift, которое существенно улучшит повседневную работу каждого разработчика.
SourceKit-LSP получил серьезные улучшения в системе автодополнения кода. Теперь при написании кода вы видите не просто названия методов, а полноценную документацию с примерами использования и всеми доступными перегрузками.
Что такое SourceKit-LSP:
SourceKit-LSP - это реализация протокола Language Server Protocol (LSP) для языков Swift и C. Если говорить простыми словами, это мост между Swift и различными редакторами кода, который обеспечивает умные возможности в любой среде разработки.
Как это работает:
Представьте: вы начинаете писать метод, и система сразу показывает все возможные варианты его использования с полным описанием параметров. Не нужно переключаться в браузер для поиска документации, вся информация доступна прямо в редакторе. Это работает не только в Xcode, но и в VS Code, Neovim и других популярных средах разработки.
Почему это важно:
Эти изменения экономят время и уменьшают количество ошибок. Особенно ценно это при работе с большими проектами и сложными API, где важно понимать все нюансы использования методов. Разработка становится более интуитивной и эффективной. Теперь разработчики могут выбирать любую удобную среду разработки, не теряя в качестве инструментов.
Обновления в SourceKit-LSP - это не просто новые фичи, а качественное улучшение процесса разработки. Они делают работу со Swift более комфортной и эффективной, экономя время и уменьшая количество ошибок.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍8 4 2❤1 1
Привет! Сегодня разберем новый инструмент для работы с многопоточностью в Swift: фреймворк Synchronization и его основной элемент Mutex. Этот подход предлагает современную альтернативу традиционным блокировкам и особенно полезен в контексте Swift Concurrency.
Что представляет собой новый Mutex:
Mutex из фреймворка Synchronization - это механизм взаимного исключения, обеспечивающий безопасный доступ к разделяемым данным в многопоточной среде. В отличие от более общих концепций блокировок, Mutex следует строгой модели владения: только поток, захвативший блокировку, может ее освободить.
Рассмотрим классический пример с потокобезопасным счетчиком:
final class Counter {
private let count = Mutex<Int>(0)
var currentCount: Int {
count.withLock { $0 }
}
func increment() {
count.withLock { $0 += 1 }
}
func decrement() throws {
try count.withLock {
guard $0 > 0 else { throw Error.reachedZero }
$0 -= 1
}
}
}
Ключевой метод withLock обеспечивает атомарный доступ к защищаемым данным, автоматически управляя блокировкой.
Интеграция с Swift Concurrency:
Особенность нового Mutex: безусловное соответствие протоколу Sendable, что позволяет безопасно использовать его в асинхронном коде. Это решает проблему работы с не Sendable типами в конкурентных контекстах:
final class PathStorage: Sendable {
let path = Mutex<NSBezierPath>(NSBezierPath())
func addPoint(_ point: CGPoint) {
path.withLock { path in
path.move(to: point)
}
}
}
Сравнение с акторами:
Возникает закономерный вопрос: зачем использовать Mutex, если существуют акторы? Ответ лежит в специфике задач:
Важные преимущества:
Новый подход предлагает несколько значимых улучшений:
Synchronization framework и Mutex представляют собой сбалансированное решение для управления многопоточностью в Swift. Они заполняют важный пробел между традиционными блокировками и современными акторами, предлагая инструмент, который одновременно мощный, типобезопасный и эффективный.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Хочешь быть в курсе самых свежих новостей, полезных советов и уникального контента? Тогда наш канал — именно то, что тебе нужно!
Что ты найдёшь в нашем канале:
Присоединись к нашему дружному сообществу и будь на шаг впереди! Подписывайся на Swift от Дена и открывай новые горизонты вместе с нами!
Не упустите шанс стать частью нашей команды!
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Swift от Дена
IOS разработчик. Swift/SwiftUI
GitHub - https://github.com/Den1Doc
App Store - https://apps.apple.com/ru/app/%D0%BC%D0%BE%D1%8F-%D1%82%D0%B0%D1%87%D0%BA%D0%B0-%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80-%D0%B0%D0%B2%D1%82%D0%BE/id6739165836
GitHub - https://github.com/Den1Doc
App Store - https://apps.apple.com/ru/app/%D0%BC%D0%BE%D1%8F-%D1%82%D0%B0%D1%87%D0%BA%D0%B0-%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80-%D0%B0%D0%B2%D1%82%D0%BE/id6739165836
👍9🗿4🔥2👀1
Всем привет! На сайте Apple Developer появился пост о новом API для приложений, которое предлагает расширенные возможности управления встроенными покупками. Речь идет о партнерской программе для мини-приложений в App Store - шаге, который открывает новые возможности для разработчиков крупных платформ.
Суть программы и основные требования:
Apple официально анонсировала программу для мини-приложений: встроенных компонентов, созданных на HTML5, JavaScript и других одобренных языках. Ключевое условие: эти мини-приложения не должны контролироваться разработчиком основного приложения, что предполагает создание открытых экосистем.
Для участия необходимо соответствие нескольким требованиям:
Преимущества для разработчиков:
Основной бенефит программы: сниженная до 15% комиссия за встроенные покупки в мини-приложениях. Это существенно ниже стандартных 30% и создает экономические стимулы для развития платформенных решений.
Программа открывает возможности для:
Бизнес-перспективы:
Пример Tencent с WeChat демонстрирует потенциал таких экосистем. Программа Apple позволяет легализовать подобные модели в iOS-экосистеме, создавая новые монетизационные каналы. Это может стимулировать появление суперапов - приложений-платформ с множеством встроенных сервисов.
Технические аспекты реализации:
Разработчикам необходимо предусмотреть:
Партнерская программа Apple для мини-приложений представляет собой стратегический шаг в развитии iOS-экосистемы. Она открывает возможности для создания платформенных решений и новых моделей монетизации, но требует тщательной технической реализации и соблюдения строгих правил. Для крупных разработчиков это шанс построить комплексные экосистемы, в то время как небольшие студии могут найти свою нишу в создании контента для таких платформ.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍9👀6😁2 1
Сталкивались с ситуацией, когда в SwiftUI кнопка или любая другая View выглядит кликабельной, но не реагирует на нажатия? Это частая проблема, и решение проще, чем кажется.
В чем проблема:
SwiftUI по умолчанию определяет область нажатия только по видимому контенту. Если у вас:
То интерактивная область может быть меньше, чем сама View.
Простое решение:
Добавьте модификатор
.contentShape() чтобы явно задать область нажатия:// Было: не работает
Rectangle()
.stroke(Color.blue, lineWidth: 2)
.frame(width: 100, height: 50)
.onTapGesture {
print("Тап!")
}
// Стало: работает
Rectangle()
.stroke(Color.blue, lineWidth: 2)
.frame(width: 100, height: 50)
.contentShape(Rectangle())
.onTapGesture {
print("Тап!")
}
Как это работает:
Модификатор
.contentShape() явно задает область, в которой должны распознаваться жесты, независимо от визуального представления. Модификатор принимает несколько вариантов значений:.contentShape(Rectangle()) // Прямоугольная область
.contentShape(Circle()) // Круглая область
.contentShape(Capsule()) // Капсульная область
// Разные стили для разных случаев
.contentShape(Rectangle(), style: FillStyle())
Параметры FillStyle:
Пример:
VStack {
Text("Первый элемент")
Text("Второй элемент")
}
.contentShape(Rectangle()) // Общая кликабельная область для всего стека
.onTapGesture {
print("Тап по любой части VStack")
}
Path { path in
path.addRect(CGRect(x: 0, y: 0, width: 100, height: 100))
path.addRect(CGRect(x: 25, y: 25, width: 50, height: 50))
}
.stroke(Color.blue, lineWidth: 2)
.contentShape(
Rectangle(),
style: FillStyle(eoFill: true) // Только внешний прямоугольник кликабелен
)
.onTapGesture {
print("Тап по внешней области")
}Модификатор
contentShape() - это надежное решение проблем с интерактивностью в SwiftUI. Он позволяет точно контролировать, какая область View должна реагировать на жесты, что особенно важно при работе с кастомными фигурами и сложными layout.Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Кот Денисова
Всем привет! Пока все увлекаются быстрым «вайбкодингом» с ИИ, появилось противоположное движение: Deep Coding. Это подход, где разработчик сохраняет полный контроль над архитектурой и качеством кода.
В чем суть Deep Coding?
Если «вайбкодинг» - это потоковое генерирование кода с доверием ИИ, то Deep Coding - это осознанное проектирование, где ИИ выступает лишь помощником в реализации деталей.
Как это работает:
Этап 1: архитектурное проектирование.
Прежде чем просить ИИ написать код, вы самостоятельно проектируете каркас будущей системы. Это как архитектор, который сначала создает чертежи здания, а только потом строители начинают работу.
Что конкретно делаете сами:
Этап 2: контроль реализации.
Вы используете ИИ для написания конкретных методов, но проверяете каждую строчку кода:
Преимущества Deep Coding:
Почему это важно именно сейчас:
Рынок начинает ценить не скорость написания кода, а способность создавать поддерживаемые и масштабируемые системы. Junior может сгенерировать код, но только Senior способен спроектировать архитектуру.
Deep Coding - это не отказ от современных инструментов, а разумное их использование. Сохраняйте архитектурное мышление, контролируйте качество кода, и пусть ИИ будет вашим помощником, а не заменой профессиональным навыкам.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍18❤11🔥5👀2 2✍1
💚 Дарим три подписки на полгода в приложении «Счетчик дней: вредные привычки» - помощника в борьбе с вредными привычками для поддержания здорового образа жизни!
Чтобы принять участие, нужно:
🔹 Подписаться на канал.
🔹 Нажать кнопку «Участвую!».
Чтобы принять участие, нужно:
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Мобильный трудоголик
🍏 🏋️ Мое приложение для отказа от вредных привычек.
Во второй половине 2023 года, после множества доработок чужих приложений на фрилансе, связанных с улучшением здоровья и качества жизни, у меня появилась идея создать собственный счетчик отказа от вредных…
Во второй половине 2023 года, после множества доработок чужих приложений на фрилансе, связанных с улучшением здоровья и качества жизни, у меня появилась идея создать собственный счетчик отказа от вредных…
❤9👍6🔥4🙏1 1
Мобильный трудоголик pinned «💚 Дарим три подписки на полгода в приложении «Счетчик дней: вредные привычки» - помощника в борьбе с вредными привычками для поддержания здорового образа жизни! Чтобы принять участие, нужно: 🔹 Подписаться на канал. 🔹 Нажать кнопку «Участвую!».»
Привет! Сегодня поговорим об архитектурных основах Swift, которые формируют фундамент работы с данными в наших приложениях. Речь пойдет о протоколах Sequence и Collection, тех строительных блоках, которые мы используем ежедневно, но чьи глубинные механизмы часто остаются за пределами нашего внимания.
В современной Swift-разработке понимание этих протоколов перестает быть опциональным знанием. Сложность приложений растет, требования к производительности ужесточаются, и умение выбирать правильные абстракции для работы с данными становится критически важным навыком.
Sequence:
Sequence представляет собой базовую концепцию последовательности элементов. Его философия проста: объект должен уметь предоставлять элементы один за другим, без обязательств по сохранению состояния или возможности повторного прохода.
Когда мы говорим о Sequence, мы имеем в виду контракт: «я могу дать вам итератор, который будет возвращать элементы до тех пор, пока они не закончатся». Именно эта простота делает Sequence идеальным для:
Collection:
Collection - это эволюция Sequence, добавляющая строгие гарантии и дополнительные возможности. Если Sequence - это поток, то Collection - это структурированное хранилище. Ключевые преимущества Collection включают:
Механика итерации:
То, что выглядит как простой синтаксический сахар:
for element in collection {
// обработка элемента
}
На самом деле преобразуется в полноценный механизм итерации:
var iterator = collection.makeIterator()
while let element = iterator.next() {
// обработка элемента
}
Такой подход обеспечивает несколько важных преимуществ:
Асинхронная революция: AsyncSequence
С приходом Swift Concurrency модель итерации получила развитие в виде AsyncSequence. Этот протокол расширяет знакомые концепции для работы с асинхронными потоками данных:
for try await event in eventStream {
await processEvent(event)
}
AsyncSequence становится особенно важен в контексте:
Рекомендации:
Когда выбирать Sequence:
Когда выбирать Collection:
Производительность:
Глубокое понимание иерархии протоколов позволяет писать более эффективный код. Компилятор Swift использует знания о соответствии типов этим протоколам для применения агрессивных оптимизаций:
Sequence и Collection - это фундаментальные подходы к работе с данными в Swift. Понимание их различий позволяет выбирать оптимальные решения для конкретных задач, предвидеть проблемы производительности и создавать эффективные кастомные реализации.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! Сегодня поговорим о протоколе ~Copyable. Данный протокол позволяет запретить неявное копирование структур, что особенно полезно при работе с ресурсами вроде файлов или сетевых соединений.
Проблема, которую решает ~Copyable:
Представьте, что у вас есть структура для работы с файлом:
struct FileHandler: ~Copyable {
private var fileDescriptor: Int32
init(path: String) {
fileDescriptor = open(path, O_RDWR)
}
consuming func close() {
close(fileDescriptor)
}
}
// Временный доступ для чтения
func readFromFile(_ handler: borrowing FileHandler) {
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 1024, alignment: 1)
defer { buffer.deallocate() }
let bytesRead = read(handler.fileDescriptor, buffer.baseAddress, 1024)
if bytesRead > 0 {
print("Прочитано \(bytesRead) байт")
}
}
// Передача владения
func takeOwnership(of handler: consuming FileHandler) {
print("Закрываем файл с дескриптором \(handler.fileDescriptor)")
handler.close()
}
// Изменение без передачи владения
func modifyFile(_ handler: inout FileHandler) {
let data = "Новые данные".data(using: .utf8)!
_ = data.withUnsafeBytes { buffer in
write(handler.fileDescriptor, buffer.baseAddress, buffer.count)
}
print("Данные записаны в файл")
}
let file = FileHandler(path: "data.txt")
readFromFile(file) // borrowing: file остается доступен
modifyFile(&file) // inout: изменяем, но владение не передается
takeOwnership(of: file) // consuming: передача владения, file больше не доступен
// file.close() // Ошибка компиляции! file уже недоступен
Без ~Copyable можно случайно создать копию структуры и получить две независимые переменные, работающие с одним файловым дескриптором. Это может привести к:
Как это работает:
После добавления ~Copyable компилятор начинает следить за перемещением экземпляров структуры. Теперь нужно явно указывать:
Когда это может быть полезно:
~Copyable особенно пригодится при:
~Copyable - это не просто очередная фича языка, а важный шаг к более безопасному и предсказуемому коду. Хотя подход требует некоторого переосмысления работы со структурами, результат стоит того: многие потенциальные ошибки переносятся из времени выполнения в время компиляции, что экономит часы отладки.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Apple продолжает радовать сообщество open-source инициативами, выпустив Swift Profile Recorder - мощный инструмент для профилирования производительности Swift-приложений. Давайте разберемся, что это за инструмент и как он может упростить жизнь разработчикам.
Что такое Swift Profile Recorder:
Это профилировщик, который работает прямо внутри вашего приложения. Ему не нужны дополнительные системные компоненты или специальные права доступа. Если говорить проще: теперь вы можете добавить профилирование в свои Swift-проекты, просто подключив библиотеку как зависимость.
Преимущества:
Практическое применение:
Добавление в проект занимает минимум усилий:
// Package.swift
dependencies: [
.package(url: "https://github.com/apple/swift-profile-recorder.git", from: "0.3.0")
]
// В коде приложения
import ProfileRecorderServer
@main
struct MyApp {
func run() async throws {
async let _ = ProfileRecorderServer(
configuration: .parseFromEnvironment()
).runIgnoringFailures(logger: logger)
// Основной код приложения
}
}
Сбор профиля через curl:
curl --unix-socket /tmp/app-samples-12345.sock \
-sd '{"numberOfSamples":1000,"timeInterval":"10ms"}' \
http://localhost/sample > profile.perf
Визуализация результатов:
Собранные данные можно анализировать в популярных инструментах:
Отличие от других решений:
В отличие от swift-parca, который использует eBPF и требует специальных привилегий, Swift Profile Recorder работает на уровне приложения. Это делает его идеальным для:
Swift Profile Recorder - это серьезный шаг в развитии инструментов для Swift-разработки. Он демократизирует доступ к продвинутому профилированию, делая его доступным для проектов любого масштаба.
Особенно ценно, что инструмент уже годами используется внутри Apple для отладки критически важных сервисов, что говорит о его надежности.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥11 5👀2✍1🙏1
Всем привет! Сегодня поговорим про библиотеку для работы с данными - SQLiteData, которая сочетает проверенную надежность SQLite с современным Swift-подходом. В основе библиотеки лежит идея предоставить разработчикам привычные инструменты, подобные тем, что есть в SwiftData, но с более предсказуемым поведением.
Модели данных:
Модели данных описываются с помощью структур и перечислений, что делает код интуитивно понятным и соответствующим духу Swift. Это обеспечивает:
Работа с запросами:
Для выборки данных предлагаются типобезопасные запросы, которые интегрируются в интерфейс через property wrappers. Важно, что эти обертки работают не только в SwiftUI, но и в любых
@Observable моделях, а также в контроллерах UIKit, что обеспечивает универсальность подхода.Интеграция с CloudKit:
Библиотека включает прямой доступ к возможностям CloudKit, обеспечивая:
Это избавляет от необходимости самостоятельной интеграции сторонних решений.
Технологическая основа:
В качестве основы используется SQLite через драйвер GRDB, что гарантирует высокую производительность и отказоустойчивость. Такой выбор технологии означает полный контроль над схемой данных и процессами миграции.
Пример:
// Модель
@Table
struct Task: Identifiable {
let id: UUID
var title: String
var isCompleted: Bool
}
struct TasksView: View {
// Запрос
@FetchAll(Task.where { !$0.isCompleted })
var pendingTasks
var body: some View {
List(pendingTasks) { task in
Text(task.title)
}
}
}
SQLiteData позиционируется как готовое решение для проектов, где важны стабильность, прозрачность работы с данными и современный подход к их обработке. Библиотека предлагает оптимальное сочетание надежности SQLite и современных Swift-практик.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17 9🔥4❤2🤔1
Привет! Хочу порекомендовать канал практикующего staff инженера из Т-Банка.
Обзоры самых актуальных новостей из мира iOS разработки, обзоры нововведений в Swift Evolution, розыгрыши билетов на конференции и просто советы для разработчиков.
➡️ Подписывайтесь на @ios_broadcast
Обзоры самых актуальных новостей из мира iOS разработки, обзоры нововведений в Swift Evolution, розыгрыши билетов на конференции и просто советы для разработчиков.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4🗿4❤1
В SwiftUI есть мощнейший инструмент для работы с графикой - Canvas API. Этот инструмент кардинально меняет подход к созданию сложных визуальных эффектов и кастомной графики в приложениях.
Проблемы до Canvas:
До появления Canvas разработчики сталкивались с серьезными ограничениями:
Фактически, для любой нетривиальной графики приходилось покидать комфортную декларативную среду SwiftUI.
Что такое Canvas API:
Canvas - это View в SwiftUI, предоставляющая прямой доступ к низкоуровневому рендерингу:
Canvas { context, size in
// Рисуем эллипс
context.fill(
Path(ellipseIn: CGRect(origin: .zero, size: size)),
with: .color(.blue)
)
// Добавляем текст
context.draw(Text("Hello Canvas"), at: CGPoint(x: size.width/2, y: size.height/2))
}Ключевые возможности:
🔹 GraphicsContext: сердце Canvas, предоставляет:
🔹 Производительность: Canvas работает напрямую с GPU, обеспечивая 60 FPS даже при сложных вычислениях.
🔹 Интеграция с SwiftUI: полная совместимость с анимациями, жестами и системой layout.
Ограничения:
Canvas API - это не просто рядовая фича в SwiftUI, а фундаментальное расширение возможностей фреймворка. Разработчики могут создавать сложную графику и визуальные эффекты, не покидая декларативной парадигмы.
Для проектов, где важна визуальная составляющая: анимированные onboarding-экраны, кастомные графики, интерактивные элементы - Canvas становится обязательным инструментом в арсенале разработчика.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Кот Денисова
Привет! У каждого из нас есть свои маленькие ритуалы. У кого-то это кофе определенным способом перед началом дня, у кого-то счастливая кружка, а у разработчиков это целый свод неписаных правил, которые, кажется, помогают коду работать.
У меня на столе, например, стоит собранный кубик Рубика и несколько сувениров, купленных в разных странах на удачу. Это не талисманы, конечно, но как-то спокойнее, когда они рядом.
Самые распространенные суеверия в нашей сфере:
Табу на пятничный деплой.
Это не суеверие, а правило выживания. Кто хоть раз разбирал последствия неудачного деплоя в пятницу вечером, тот понимает насколько неприятно исправлять проблемы в выходные, вместо отдыха. Это не суеверие, а скорее горький опыт, возведенный в традицию.
Феномен «озарения у доски».
Не можешь найти ошибку? Начни объяснять ее коллеге или просто проговори вслух и решение придет само. Именно из этого ритуала пошел мем с резиновым утенком. Выглядит со стороны очень забавно, но работает!
Проклятие «легкой задачи».
Стоит только сказать на планировании: «Да это за час сделается!», как задача обязательно превратится в многодневный марафон с переписыванием половины кодовой базы. Закон подлости? Или просто недооценка сложности?
Магический перезапуск.
Не работает? Не читай логи, а просто перезапусти! Не собирается? Перезапусти билд! И ведь часто это помогает!
«Не смотри на процесс сборки - упадет!» или «Смотри пристально, иначе сломается!».
Здесь разработчики делятся на два лагеря. Одни уверены: если ты уйдешь от монитора, пока идет билд, все обязательно сломается. Другие ровно наоборот: стоит только начать пристально следить за консолью, как система тут же выдаст ошибку. Парадокс! Каждому свое.
Почему это работает (или кажется, что работает)?
На самом деле, многие ритуалы - это способ вернуть себе ощущение контроля над сложными и непредсказуемыми системами. Психологи называют это «иллюзией контроля».
Когда мы выполняем ритуальные действия (не смотрим на процесс сборки, перезапускаем без чтения логов пайплайн), мы снижаем тревожность. А спокойный разработчик - это эффективный разработчик.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14 8👍4🔥1🫡1